下面两种说法,哪种正确?

boy8765 2009-06-10 08:19:56
在有虚函数的类的实例中,这个虚函数表(Virtual Table)被分配在这个实例的内存中?(也就是说,VTBL与实例对象共在一块内存中)
虚函数表(VTBL)是由类的所有实例共享的,在内存中只有一份,每个实例持有一个VPTR指向该类的虚函数表(VTBL)?(也就是说,VPTR与实例对象共在一块内存中,VTBL在另外一块内存中,这两块内存由VPTR联系,即VPTR指向VTBL)
...全文
106 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
boy8765 2009-06-16
  • 打赏
  • 举报
回复
楼主回复12楼:这是两个等价形式.你说的我懂.谢谢.
yxq281426250 2009-06-16
  • 打赏
  • 举报
回复
学习~~!~!
andylovecandy 2009-06-16
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 boy8765 的回复:]
如果第2种说法是正确的,那么,在陈皓所写的http://blog.csdn.net/haoel/archive/2008/10/15/3081328.aspx中,为什么可以定义一个int** pVtab 来作为遍历对象内存布局的指针,而且可以方便地像使用数组一样来遍历所有的成员包括其虚函数表了?这是第一个问题。
第二个问题是:如按文中所言,可以遍历所有的成员包括其虚函数表,所以,虚函数表与其他成员应该是放在一块内存中的。但现在网友们都是选择第2种,为什么?
[/Quote]

原文:
Derive d;
int** pVtab = (int**)&d;
pFun = (Fun)pVtab[0][0];
……
pFun = (Fun)pVtab[s][0];
……
pFun = (Fun)pVtab[s][1];

我一般是这样用:
Derive d;
pFun=(Fun)*((int*)*(int*)(&d));
……
pFun=(Fun)*((int*)*((int*)(&d)+s));
……
pFun=(Fun)*((int*)*(int*)(&d)+1);

这样能否理解?
taodm 2009-06-16
  • 打赏
  • 举报
回复
看《深度探索C++对象模型》,不要太相信网文。
中才德创 2009-06-13
  • 打赏
  • 举报
回复
遍历对象内存布局的指针,并不代表要分配内存给它。
boy8765 2009-06-13
  • 打赏
  • 举报
回复
如果第2种说法是正确的,那么,在陈皓所写的http://blog.csdn.net/haoel/archive/2008/10/15/3081328.aspx中,为什么可以定义一个int** pVtab 来作为遍历对象内存布局的指针,而且可以方便地像使用数组一样来遍历所有的成员包括其虚函数表了?这是第一个问题。
第二个问题是:如按文中所言,可以遍历所有的成员包括其虚函数表,所以,虚函数表与其他成员应该是放在一块内存中的。但现在网友们都是选择第2种,为什么?
sszwbuaa 2009-06-11
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 lylm 的回复:]
补充:编译器发现一个类中有被声明为virtual的函数,就会为其搞一个虚函数表,也就是VTABLE。VTABLE实际上是一个函数指针的数组,每个虚函数占用这个数组的一个slot。一个类只有一个VTABLE,不管它有多少个实例。派生类有自己的VTABLE,但是派生类的VTABLE与基类的VTABLE有相同的函数排列顺序,同名的虚函数被放在两个数组的相同位置上。在创建类实例的时候,编译器还会在每个实例的内存布局中增加一个vptr字段,该字段指向本类的…
[/Quote]
顶!!!
zjf30366 2009-06-11
  • 打赏
  • 举报
回复
大家都说第二个那就是第二个的咯。
青岛芒果 2009-06-11
  • 打赏
  • 举报
回复
这个东西用VC反汇编查看一下就很快得到明确答案了。第二种无疑是正确的。
jhony_lee 2009-06-11
  • 打赏
  • 举报
回复
只有一个指向虚函数表的指针
pathuang68 2009-06-11
  • 打赏
  • 举报
回复
肯定是第2种情况才是正确的。
Jalien 2009-06-11
  • 打赏
  • 举报
回复
第二种。
lylm 2009-06-10
  • 打赏
  • 举报
回复
补充:编译器发现一个类中有被声明为virtual的函数,就会为其搞一个虚函数表,也就是VTABLE。VTABLE实际上是一个函数指针的数组,每个虚函数占用这个数组的一个slot。一个类只有一个VTABLE,不管它有多少个实例。派生类有自己的VTABLE,但是派生类的VTABLE与基类的VTABLE有相同的函数排列顺序,同名的虚函数被放在两个数组的相同位置上。在创建类实例的时候,编译器还会在每个实例的内存布局中增加一个vptr字段,该字段指向本类的VTABLE。通过这些手段,编译器在看到一个虚函数调用的时候,就会将这个调用改写
lylm 2009-06-10
  • 打赏
  • 举报
回复
第2种

65,211

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧