- 博客(70)
- 收藏
- 关注
原创 程序性能 CPU cache
对程序优化进行,一般是采用良好的算法,合理使用编程语法,但有些时候我们也要考虑硬件的问题,比如CPU cache的优化。CPU cache对性能会有什么影响呢,先考虑一个例子:假设我们需要对一个数组求和,代码如下:int m = 1;for (int i = 0;
2011-08-01 11:57:36
1186
原创 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
1415
原创 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
24358
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
1356
2
原创 CppUnit 测试类注册过程
--------------------------------------------------------------------------------------1. 实现一个最简单的测试类--------------------------------------------------------------------------------------#include
2010-03-22 17:24:00
1403
原创 在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
1409
转载 当析构函数遇到多线程 —— 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
1275
原创 tinyxml 的一个小 bug
阅读 tinyxml 的源代码 (版本: 2.5.3),发现一个小小的问题,先上测试代码吧:void xml_test(){ { const char* xmlString = "" " " ""; TiXmlDocument doc;
2010-01-14 17:19:00
2746
原创 tinyxml 的一个小 bug
阅读 tinyxml 的源代码 (版本: 2.5.3),发现一个小小的问题,先上测试代码吧:void xml_test(){ { const char* xmlString = "" " " ""; TiXmlDocument doc; doc.Parse( xmlString )
2010-01-14 17:19:00
1230
原创 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
895
原创 很无语啊,为啥好好一篇文章,拷到CSDN上格式就全乱了……考虑换博客了
在google doc上写好了文章,直接通过"publish post"方式发布到csdn博客上,结果打开一看,所有的类似 template class Heap{} 全变成了templateclass Heap{} 然后干脆直接在csdn 博客上重新排一下,结果编辑框换行好好地,保存后再打开所有内容都缩成了一行。呜呜呜,整这格式整
2009-12-02 16:17:00
944
原创 C++模板知识总结
//参考 《C++必知必会》 条款45 - 60/////////////////////////////////////////////////////////内容介绍//1.定义一个普通的模板//2.模板显式特化//3.模板局部特化//4.类模板成员特化//5.成员模板//6.模板的模板参数//7.泛型编程1 嵌入
2009-12-02 15:46:00
1133
原创 软件调试_阅读总结_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
847
原创 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
1640
翻译 Win32 SEH异常深度探索_9 总结
最后,整个SEH的调用关系如下: KiUserExceptionDispatcher() RtlDispatchException() RtlpExecuteHandlerForException() ExecuteHandler() //
2009-09-25 13:57:00
975
翻译 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
1978
原创 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
1529
翻译 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
1185
翻译 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
1508
翻译 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
1560
翻译 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
1408
翻译 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
1486
翻译 Win32 SEH异常深度探索_1
最近学习C++异常实现机制,面对一堆汇编代码无所适从,无意中看到这样一篇文章,读完后感觉对整个异常的原理清晰很多。看来学习还是要多去读读大牛的文章呀。这里严格来说并不算是翻译,仅仅是提炼的一些总结而已。具体内容还是参照原文把。原文地址:http://www.microsoft.com/msj/0197/exception/exception.aspx
2009-09-25 13:40:00
1889
原创 C++异常处理机制__3.编译器何时生成栈回退代码
学习异常原理,先从几个例子看起编译器什么时候生成异常支持代码(栈回退支持)//没有栈回退代码void cpp_exception_test1(){ int *p = new int; CMyClass1 s1;}//有栈回退代码void cpp_exception_test2(){ CMyClass1 s1;
2009-09-16 16:27:00
1711
原创 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
5024
原创 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
2703
原创 程序内存布局
程序虚拟地址布局:从高到低: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
1243
原创 CreateFile 一点总结
CreateFile的函数原型如下:HANDLE CreateFile( LPCTSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDisposition, DWORD dw
2009-09-07 16:14:00
8175
原创 通过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
3820
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
2477
原创 通过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
1767
原创 软件设计_接口_中间层
软件设计的核心:通过设计稳定的接口,分隔系统各部分(上下层次:上层应用逻辑/底层核心支撑框架;平行的层次:模型/视图/控制器),让各部分独立的变化。接口在软件设计中至关重要,设计良好,稳定可靠,高内聚低耦合,可扩展性强的接口能保证软件稳定的进展升级。软件架构其实就是接口的设计。设计模式的核心思想:1.分析系统中经常变化的和稳定的部分2.设计接口分隔上面两部分3.通过
2009-08-13 16:30:00
4673
原创 COM学习笔记8_IDispatch (调度接口) 自动化
一般的通讯方式:客户 COM(vbtl)接口 COM组件自动化通讯方式:客户(自动化控制器) IDispatch::Invoke 调度接口(或vbtl接口) 实现IDispatch接口的COM组件 (自动化服务器)自动化服务器 : COM组件自动化控制器 :COM客户相关知识:IDispatch, 调度接口,双重接口,类型库,IDL, VARIANT,
2009-08-11 14:01:00
11172
原创 COM学习笔记7_跨进程COM组件
由于内存不能跨进程访问,所以访问exe中的COM组件需要额外处理1.跨进程调用函数 : 可以通过LPC (本地过程调用) 实现2.参数传递 : 通过"调整",若在同一机器上,需要拷贝参数,若在远端,还需要考虑机器数据表示方面的不同。调整 :将函数调用的参数从一个进程地址空间传到另一个进程地址空间参数的调整可以通过IMarshal接口实现LPC通过代理/残根调整参数
2009-08-11 14:00:00
3745
原创 COM学习笔记6_COM的复用:包容和聚合
继承可分实现继承和接口继承接口继承 :一个类只能继承另一个接口。一个接口是里面只有纯虚函数,没有数据和函数实现实现继承 :一个类继承另一个类,包括基类中的各种数据和实现COM不支持实现继承,因为实现继承会造成较大耦合,违背了COM的思想。COM实现复用可采用包容和聚合--------------------------------------------------
2009-08-11 13:59:00
1553
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
1229
原创 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
2500
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
2565
原创 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
1851
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
1330
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人