自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(70)
  • 收藏
  • 关注

原创 程序性能 CPU cache

对程序优化进行,一般是采用良好的算法,合理使用编程语法,但有些时候我们也要考虑硬件的问题,比如CPU cache的优化。CPU cache对性能会有什么影响呢,先考虑一个例子:假设我们需要对一个数组求和,代码如下:int m = 1;for (int i = 0;

2011-08-01 11:57:36 1174

原创 Excel支持多少单元格

<br />今天突发奇想,试试Excel到底能支持多少个单元格,是否能支持无限个,于是打开Excel,按住右方向键,让屏幕一直右移,最后在IV处停下了。<br />I在字母中第9位,V在字母中第22位,共26个字母<br />于是Excel支持横向单元格共 26 + (9 - 1) * 26 + 22 = 256个,正好一个byte范围。<br />然后按住 Page Down 键一直向下,最后在第65536行停处,哈,正好2个byte,或一个short范围。<br /> <br />结论,Excel 共支

2010-08-04 15:08:00 1345

原创 C++给函数传数组参数

<br />在C++中,如果要给一个函数传入一个数组,一般都是传入两个参数一个数组指针和一个数组大小<br />例:<br />void print_1 (int n, int *datas)<br />{<br />    for (int i = 0; i < n; ++i)<br />    {<br />        std::cout << datas[i] << " ";<br />    }<br />    std::cout << std::endl;

2010-07-16 15:35:00 24296 7

原创 Vs2005 C++编译器的一个bug?

今天使用VS2005编译如下C++代码时,发生编译器Cl.exe crash: 测试代码:static void f1 (){ struct St { int x; std::string s; }; struct CompSt { bool operator () (con

2010-03-26 11:35:00 1344 2

原创 CppUnit 测试类注册过程

--------------------------------------------------------------------------------------1. 实现一个最简单的测试类--------------------------------------------------------------------------------------#include

2010-03-22 17:24:00 1398

原创 在C++中实现类似C#的字符串格式功能

在C#中,我们可以这样格式化一个字符串String s = String.Format ("The {0} costs {1}{2}", "car", 30000, "yuan");而在C++中,我们只能这样处理sprintf (s, "The %s costs %d%s", "car", 30000, "yuan");这种处理方法极不安全这里实现了一个类似C#的字符串

2010-03-18 17:44:00 1374

转载 当析构函数遇到多线程 —— C++ 中线程安全的对象回调

很好的一篇文章,原文地址:http://www.cppblog.com/Solstice/archive/2010/01/28/dtor_meets_threads.html  当析构函数遇到多线程 —— C++ 中线程安全的对象回调 当析构函数遇到多线程── C++ 中线程安全的对象回调 陈硕 (giantchen_AT_gmail)本文

2010-01-28 13:43:00 1255

原创 tinyxml 的一个小 bug

阅读 tinyxml 的源代码 (版本: 2.5.3),发现一个小小的问题,先上测试代码吧:void xml_test(){    {        const char* xmlString =            ""            "   "            "";        TiXmlDocument doc;    

2010-01-14 17:19:00 2722

原创 tinyxml 的一个小 bug

阅读 tinyxml 的源代码 (版本: 2.5.3),发现一个小小的问题,先上测试代码吧:void xml_test(){    {        const char* xmlString =            ""            "   "            "";        TiXmlDocument doc;        doc.Parse( xmlString )

2010-01-14 17:19:00 1207

原创 STL::vector 探索

成员变量_MyFirst_MyLast_MyEnd底层函数bool _Buy(size_type _Capacity) 开辟一段内部存储空间void _Destroy(pointer _First, pointer _Last) 对这些元素做析构操作 (或什么也不干)void _Tidy() 销毁内部存储空间 (包括对内部元素的析构操作)_OutIt unchecked_copy(_InIt _F

2009-12-03 14:15:00 888

原创 很无语啊,为啥好好一篇文章,拷到CSDN上格式就全乱了……考虑换博客了

在google doc上写好了文章,直接通过"publish post"方式发布到csdn博客上,结果打开一看,所有的类似 template class Heap{} 全变成了templateclass Heap{}  然后干脆直接在csdn 博客上重新排一下,结果编辑框换行好好地,保存后再打开所有内容都缩成了一行。呜呜呜,整这格式整

2009-12-02 16:17:00 929

原创 C++模板知识总结

//参考 《C++必知必会》 条款45 - 60/////////////////////////////////////////////////////////内容介绍//1.定义一个普通的模板//2.模板显式特化//3.模板局部特化//4.类模板成员特化//5.成员模板//6.模板的模板参数//7.泛型编程1 嵌入

2009-12-02 15:46:00 1123

原创 软件调试_阅读总结_2_CPU基础

第二章 CPU基础1 CPU支持的指令集:RISC (Reduced Instruction Set Computer, 精简指令集计算机) 和 CISC (Complex Instruction Set Computer, 复杂指令集计算机)比较:RISCCISC代表PowerPC, Alpha, ARM...X86, AMD指令长度等长(4字节)利于反汇编和代码断点不定(1 - *)P6系列使

2009-10-28 15:35:00 835

原创 C++汇编实现分析__1

int _tmain(int argc, _TCHAR* argv[]){    string *pStr = new string ("abc");    delete pStr;    return 0;}VS2005,Release,优化关闭时的汇编代码int _tmain(int argc, _TCHAR* argv[]){00401B40  push        ebp  00401B

2009-10-21 16:21:00 1606

翻译 Win32 SEH异常深度探索_9 总结

最后,整个SEH的调用关系如下: KiUserExceptionDispatcher()      RtlDispatchException()         RtlpExecuteHandlerForException()              ExecuteHandler() //

2009-09-25 13:57:00 937

翻译 Win32 SEH异常深度探索_8 异常处理是如何开始的

If youve made it this far, it wouldnt befair to finish without completing the entire circuit. Ive shown how theoperating system calls a user-defined function when an exception occurs. Ivesho

2009-09-25 13:56:00 1944

原创 Win32 SEH异常深度探索_7 对未处理异常的默认处理

UnhandledExceptionsEarlier in the article, I put off a fulldescription of the UnhandledExceptionFilter API. You normally dont call thisAPI directly (although you can). Most of the time,

2009-09-25 13:53:00 1473

翻译 Win32 SEH异常深度探索_6 回退

UnwindingLets briefly recap what unwinding meansbefore digging into the code that implements it. Earlier, I described howpotential exception handlers are kept in a linked list, pointed to

2009-09-25 13:52:00 1146

翻译 Win32 SEH异常深度探索_5 一个异常帧链表遍历例子

If youre feeling a bit overwhelmed at thispoint by things like EXCEPTION_REGISTRATIONs, scopetables, trylevels,filter-expressions, and unwinding, so was I at first. The subject ofcompiler-level

2009-09-25 13:50:00 1472

翻译 Win32 SEH异常深度探索_4 编译器对SEH的支持

While Ive made occasional reference to_try and _except, just about everything Ive written about so far is implementedby the operating system. However, in looking at the contortions of my two sma

2009-09-25 13:47:00 1538

翻译 Win32 SEH异常深度探索_3 默认异常回调函数

 So far, Ive implicitly assumed that the operatingsystem always finds a handler somewhere in the linked list ofEXCEPTION_REGISTRATIONs. What happens if nobody steps up to the plate? As itturn

2009-09-25 13:46:00 1383

翻译 Win32 SEH异常深度探索_2 异常链表遍历

With this simplest of scenarios behind us, lets goback and fill in some of the blanks. While this exception callback is great,its not a perfect solution. In an application of any size, it would

2009-09-25 13:43:00 1448

翻译 Win32 SEH异常深度探索_1

最近学习C++异常实现机制,面对一堆汇编代码无所适从,无意中看到这样一篇文章,读完后感觉对整个异常的原理清晰很多。看来学习还是要多去读读大牛的文章呀。这里严格来说并不算是翻译,仅仅是提炼的一些总结而已。具体内容还是参照原文把。原文地址:http://www.microsoft.com/msj/0197/exception/exception.aspx

2009-09-25 13:40:00 1853

原创 C++异常处理机制__3.编译器何时生成栈回退代码

 学习异常原理,先从几个例子看起编译器什么时候生成异常支持代码(栈回退支持)//没有栈回退代码void cpp_exception_test1(){ int *p = new int; CMyClass1 s1;}//有栈回退代码void cpp_exception_test2(){ CMyClass1 s1;

2009-09-16 16:27:00 1697

原创 C++异常处理机制__2.SEH异常抛出与处理

测试函数:void SEH_test2(){ int *p1 = NULL; __try { *p1 = 10; } __except(EXCEPTION_EXECUTE_HANDLER) { cout << "SHE_test2::__except" << endl; }}

2009-09-16 12:39:00 4958

原创 C++异常处理机制__1.SEH处理的函数栈布局

C++可以有两种异常处理方法1. SEH exceptions (Structured Exception Handling), 结构化异常处理它有三个关键字__try, __except, __finally,并通过RaiseException 抛出异常其中一个__try后只能跟一个__except或一个__finally。当__try后跟__except时,为异常处理(ex

2009-09-15 17:02:00 2671

原创 程序内存布局

程序虚拟地址布局:从高到低:0X8000,0000 - 0XFFFF,FFFF  内核空间0X7FFF,0000 - 0X7FFF,FFFF   64K的禁止进入区0X0001,0000 - 0X7FFE,FFFF  用户空间0X0000,0000 - 0X0000,FFFF  NULL指针分配区(64K)其中用户空间中,用户的exe程序一般加载到0X0040,00

2009-09-07 16:17:00 1201

原创 CreateFile 一点总结

CreateFile的函数原型如下:HANDLE CreateFile( LPCTSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDisposition, DWORD dw

2009-09-07 16:14:00 8148

原创 通过ATL开发COM_3实现类厂和组件的创建

类工厂的实现,组件的创建过程1. 在*_Server.cpp 中有BEGIN_OBJECT_MAP(ObjectMap) OBJECT_ENTRY(CLSID_Math, CMath)END_OBJECT_MAP() 展开后是这样:struct _ATL_OBJMAP_ENTRY30{ const CLSID* pclsid; HR

2009-08-18 18:31:00 3784 1

原创 通过ATL开发COM_2实现IUnknown接口

每个COM组件需要实现这三个功能1. 实现IUnknown接口 (通过 CComObjectRootEx 实现)2. 实现一个类工厂,支持组件的创建 (通过 CComCoClass 实现)3. 实现自注册 ATL是如何实现IUnknown接口的? 组件通过派生CComObjectRootEx 获得 IUnknown支持template class CComObj

2009-08-18 18:28:00 2450

原创 通过ATL开发COM_1概述

ATL 是为了减轻程序员开发COM的负担而提供的一套模板库ATL提供的支持:1. CComModule封装对组件的宿主支持,掩盖了(DLL和EXE)之间的差别。2. 对IUnknown的支持3. 对类工厂的支持4. 自动化 : IDispatchImplCOM 数据类型 : CComBSTR, CComVariant接口指针 : CComPtr, CComQIPtr

2009-08-18 18:26:00 1743

原创 软件设计_接口_中间层

软件设计的核心:通过设计稳定的接口,分隔系统各部分(上下层次:上层应用逻辑/底层核心支撑框架;平行的层次:模型/视图/控制器),让各部分独立的变化。接口在软件设计中至关重要,设计良好,稳定可靠,高内聚低耦合,可扩展性强的接口能保证软件稳定的进展升级。软件架构其实就是接口的设计。设计模式的核心思想:1.分析系统中经常变化的和稳定的部分2.设计接口分隔上面两部分3.通过

2009-08-13 16:30:00 4608

原创 COM学习笔记8_IDispatch (调度接口) 自动化

一般的通讯方式:客户 COM(vbtl)接口 COM组件自动化通讯方式:客户(自动化控制器) IDispatch::Invoke 调度接口(或vbtl接口) 实现IDispatch接口的COM组件 (自动化服务器)自动化服务器 : COM组件自动化控制器 :COM客户相关知识:IDispatch, 调度接口,双重接口,类型库,IDL, VARIANT,

2009-08-11 14:01:00 11123

原创 COM学习笔记7_跨进程COM组件

由于内存不能跨进程访问,所以访问exe中的COM组件需要额外处理1.跨进程调用函数 : 可以通过LPC (本地过程调用) 实现2.参数传递 : 通过"调整",若在同一机器上,需要拷贝参数,若在远端,还需要考虑机器数据表示方面的不同。调整 :将函数调用的参数从一个进程地址空间传到另一个进程地址空间参数的调整可以通过IMarshal接口实现LPC通过代理/残根调整参数

2009-08-11 14:00:00 3725

原创 COM学习笔记6_COM的复用:包容和聚合

继承可分实现继承和接口继承接口继承 :一个类只能继承另一个接口。一个接口是里面只有纯虚函数,没有数据和函数实现实现继承 :一个类继承另一个类,包括基类中的各种数据和实现COM不支持实现继承,因为实现继承会造成较大耦合,违背了COM的思想。COM实现复用可采用包容和聚合--------------------------------------------------

2009-08-11 13:59:00 1539 1

原创 COM学习笔记5_使用类厂创建COM组件

<br />我们在前面创建COM组件都是通过直接或间接调用CreateInstance。<br />在实际COM库中,对应创建组建的函数是CoCreateInstance,它原型如下:<br />WINOLEAPI CoCreateInstance(IN REFCLSID rclsid, IN LPUNKNOWN pUnkOuter, IN DWORD dwClsContext, IN REFIID riid, OUT LPVOID FAR* ppv);<br

2009-08-11 13:51:00 1210

原创 COM学习笔记4_创建COM组件的实现

为了实现COM的动态链接,必须把组件的实现和客户代码分隔开。一种处理是把组件放入DLL中。这样为了支持客户创建组建,组件需要导出一个类似CreateInstance的函数。extern "C" IUnknown* CreateInstance(){ IUnknown* pI = static_cast(new CA) ; pI->AddRef() ; return pI

2009-08-11 13:48:00 2465 1

原创 COM学习笔记3_IUnknown的三个接口函数

对于COM组件,正确处理IUnknown的三个接口函数非常重要。对于QueryInterface,一个参考处理如下:HRESULT __stdcall CA::QueryInterface(const IID& iid, void** ppv){ if (iid == IID_IUnknown) { *ppv = static_cast(this) ; }

2009-08-11 13:43:00 2531

原创 COM学习笔记2_COM接口vbtl内存布局

  这里要注意的是,虽然图中显示IY的虚函数表中QueryInterface,AddRef和Release指向的函数地址与IX的虚函数表中对应函数相同,都直接指向CA::QueryInterface等。但其实并不完全是这样。如果看汇编实现,可以看到IY中的AddRef指向的地址是这样:[thunk]:CA::AddRef`adjustor{4}:0040174

2009-08-11 13:38:00 1833 1

原创 COM学习笔记1_COM初步探索

COM组件的两个重要需求:1。 动态链接2。 隐藏实现细节COM初步探索一个典型C++客户和组件的例子// 组件模块interface IX{ virtual void __stdcall Fx1() = 0 ; virtual void __stdcall Fx2() = 0 ;} ;interface IY{ virtual void

2009-08-11 13:29:00 1306

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除