摘要:COM对象内存布局,多继承是虚继承吗? 接口之间怎么切换? 1) 是普通的多继承,不是虚继承。因为父类接口只是含有纯虚函数,不含任何数据成员,所以问题不大。 2) QueryInterface可以用来在COM对象实现的接口之间切换。内部实现可以是表驱动或者用static_cast。 摘自Essent 阅读全文
VS里用Sos扩展调试CLR总结
2013-08-05 22:48 by Dirichlet, 248 阅读, 0 推荐, 收藏, 编辑
摘要:暂时不用Windbg,用VS来调试CLR。 1) Enable unmanaged debugging 2) Load sos.dll into vs. !DumpHead -type SimpleClass 获得SimpleClass对象的一个地址,0x0280b630 3) 观察0x0280b6 阅读全文
c++中如何查看一个类的内存布局
2013-08-05 22:48 by Dirichlet, 918 阅读, 0 推荐, 收藏, 编辑
摘要:打开VS command prompt,输入下述命令可以看到对象的内存布局。 cl a.cpp -d1 reportSingleClassLayout[classname] // reportSingleClassLayout和[classname]之间没空格。 参考: http://blog.cs 阅读全文
COM组件多接口对象模型
2013-08-04 14:38 by Dirichlet, 1388 阅读, 0 推荐, 收藏, 编辑
摘要:COM组件有两种接口类型,Dual and Custom,如下图所示。本文说的是Custom。所谓多接口COM对象是指此COM对象实现了多于一个的自定义接口,即Custom接口。 接口图如下: 需要注意的是最终实现的COM对象用的不是虚继承而是普通的多继承,因为被多继承的IUnknown接口是不含任 阅读全文
C++异常机制的实现方式和开销分析
2013-07-29 14:09 by Dirichlet, 288 阅读, 0 推荐, 收藏, 编辑
摘要:转自:http://baiy.cn/doc/cpp/inside_exception.htm(转载)C++异常机制的实现方式和开销分析白杨http://baiy.cn 在我几年前开始写《C++编码规范与指导》一文时,就已经规划着要加入这样一篇讨论 C++ 异常机制的文章了。没想到时隔几年以后才有机会把这个尾巴补完 :-)。还是那句开场白:“在恰当的场合使用恰当的特性” 对每个称职的 C++ 程序员来说都是一个基本标准。想要做到这点,就必须要了解语言中每个特性的实现方式及其时空开销。异常处理由于涉及大量底层内容,向来是 C++ 各种高级机制中较难理解和透彻掌握的部分。本文将在尽量少引入底层细节的 阅读全文
虚继承
2013-07-29 13:05 by Dirichlet, 787 阅读, 0 推荐, 收藏, 编辑
摘要:图例,典型菱形虚继承。 内存布局: 虚子类Left, Right在最上,虚基类在最下面,本质是两个虚子类对象的开始部分都含有一个虚指针指向虚表,虚表里有相对于Top的偏移量。 当做Right,Left指针到Top指针的转换时,需要用到这个偏移量。 Right* right; Left* left; 阅读全文
dynamic_cast, RTTI, 整理
2013-07-29 11:43 by Dirichlet, 2194 阅读, 0 推荐, 收藏, 编辑
摘要:主要是参考下图,了解内存布局,然后写个实例程序就差不多明白了,但是需要熟悉指针转换。1) 只有多态类才有RTTI信息,dynamic_cast正是运用RTTI进行转换,属于运行时类型检查。2) dynamic_cast判断两个指针是否能转换时,用RTTI可以知道当前实际对象,然后遍历自己所有的父类,看是否有与目标类型一致的,如果有就可以进行转换。3) dynamic_cast是安全的,可以通过检查返回值或异常捕捉来判断是否转成功。其中检查返回值用于指针转换,异常捕捉用于引用转换。4) 补充一点,与static_cast不同,即使两个类没有直接继承关系,但是只要在一个类层次结构中,就有可能指向同 阅读全文
staitic_cast原理与使用
2013-07-29 10:55 by Dirichlet, 1847 阅读, 0 推荐, 收藏, 编辑
摘要:本文以下述结构为例: 总结如下: 1) static_cast用于有直接或间接关系的指针或引用之间 转换。没有继承关系的指针不能用此转换,即使二者位于同一类体系中。比如,Left,Right之间不能用static_cast,编译器无法确定二指针如何移动偏移量,请考虑Left,Right还有可能位于其 阅读全文
多重继承和虚继承的内存布局(转)
2012-06-08 22:45 by Dirichlet, 240 阅读, 0 推荐, 收藏, 编辑
摘要:转自:http://blog.csdn.net/littlehedgehog/article/details/5442430 这篇文章主要讲解虚继承的C++对象内存分布问题,从中也引出了dynamic_cast和static_cast本质区别、虚函数表的格式等一些大部分C++程序员都似是而非的概念。 阅读全文
异常设计准则
2011-08-30 22:13 by Dirichlet, 569 阅读, 0 推荐, 收藏, 编辑
摘要:1. 抛出异常/设计异常(框架层) a. 先捕获,包装捕获的异常再抛出。包装异常时务必要指定内部异常。 b. 异常消息进行本地化,支持多语言。//设计当前引发异常层次(当前框架层次)的所有错误代码,每个异常都有一个错误代码表示。 2. 捕捉异常 a. 不要通过在框架代码中捕捉非特定异常(如 Syst 阅读全文