代码改变世界

随笔档案-2013年08月

多继承对象的虚函数表

2013-08-05 22:50 by Dirichlet, 2824 阅读, 收藏, 编辑
摘要: 子对象多重继承自多个基类,每个基类都有虚函数,那么子类对象的内存布局是什么样的?有一个虚函数表还是多个?示例程序: 1 #include "iostream" 2 #include "string" 3 #include 4 using namespace std; 5 6 7 class Base1 8 { 9 public:10 Base1(): x(1){}11 virtual void QueryInterface() { }12 virtual void AddRef(){}13 virtual void Release(){}14 15 pr 阅读全文

COM对象模型

2013-08-05 22:49 by Dirichlet, 350 阅读, 收藏, 编辑
摘要: COM对象内存布局,多继承是虚继承吗? 接口之间怎么切换? 1) 是普通的多继承,不是虚继承。因为父类接口只是含有纯虚函数,不含任何数据成员,所以问题不大。 2) QueryInterface可以用来在COM对象实现的接口之间切换。内部实现可以是表驱动或者用static_cast。 摘自Essent 阅读全文

CLR 虚方法调用和接口方法调用

2013-08-05 22:49 by Dirichlet, 314 阅读, 收藏, 编辑
摘要: 不知接口方法和虚方法分发有什么区别?似乎在CIL中都是callvirt指令。 对,MSIL里都是callvirt,但JIT的时候得到了不同的处理:对虚方法的分发是编译成这样: X86代码 mov ecx, esi ; 假设现在ESI是一个指向对象实例的指针,复制到ECX里 mov eax, dwor 阅读全文

VS里用Sos扩展调试CLR总结

2013-08-05 22:48 by Dirichlet, 248 阅读, 收藏, 编辑
摘要: 暂时不用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, 921 阅读, 收藏, 编辑
摘要: 打开VS command prompt,输入下述命令可以看到对象的内存布局。 cl a.cpp -d1 reportSingleClassLayout[classname] // reportSingleClassLayout和[classname]之间没空格。 参考: http://blog.cs 阅读全文

COM组件双接口对象模型

2013-08-04 14:54 by Dirichlet, 546 阅读, 收藏, 编辑
摘要: 模型如下: 这里COM对象一共实现了三个接口,IUnknown,IDispatch, Ixxx. 每个COM都必须实现IUnknown,不考虑在内的话共实现了IDispatch和自定义接口Ixxx两个,故称双接口对象。 IDispatch主要是给解释型语言脚本用的,因为脚本没办法直接调用多态的接口函 阅读全文

COM组件多接口对象模型

2013-08-04 14:38 by Dirichlet, 1397 阅读, 收藏, 编辑
摘要: COM组件有两种接口类型,Dual and Custom,如下图所示。本文说的是Custom。所谓多接口COM对象是指此COM对象实现了多于一个的自定义接口,即Custom接口。 接口图如下: 需要注意的是最终实现的COM对象用的不是虚继承而是普通的多继承,因为被多继承的IUnknown接口是不含任 阅读全文
点击右上角即可分享
微信分享提示