社区
C++ 语言
帖子详情
下面两种说法,哪种正确?
boy8765
2009-06-10 08:19:56
在有虚函数的类的实例中,这个虚函数表(Virtual Table)被分配在这个实例的内存中?(也就是说,VTBL与实例对象共在一块内存中)
虚函数表(VTBL)是由类的所有实例共享的,在内存中只有一份,每个实例持有一个VPTR指向该类的虚函数表(VTBL)?(也就是说,VPTR与实例对象共在一块内存中,VTBL在另外一块内存中,这两块内存由VPTR联系,即VPTR指向VTBL)
...全文
107
14
打赏
收藏
下面两种说法,哪种正确?
在有虚函数的类的实例中,这个虚函数表(Virtual Table)被分配在这个实例的内存中?(也就是说,VTBL与实例对象共在一块内存中) 虚函数表(VTBL)是由类的所有实例共享的,在内存中只有一份,每个实例持有一个VPTR指向该类的虚函数表(VTBL)?(也就是说,VPTR与实例对象共在一块内存中,VTBL在另外一块内存中,这两块内存由VPTR联系,即VPTR指向VTBL)
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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种
关于OutOfMemoryError,
下面
说法
正确
的是()?
题目 (多选)关于OutOfMemoryError,
下面
说法
正确
的是()? A. java.lang.OutOfMemoryError: PermGen space 增加-XX:MaxPermSize这个参数的值的话,这个问题通常会得到解决。 B. java.lang.OutOfMemoryError: Requested array size exceeds VM limit当你正准备创建一个超...
在JAVA中,
下面
对继承的
说法
,
正确
的是()
在JAVA中,
下面
对继承的
说法
,
正确
的是() A. 子类能继承父类的所有成员 B. 子类继承父类的非私有方法和状态 C. 子类只能继承父类的public方法和状态 D. 子类只能继承父类的方法 答案:A 解析: 我们有时候会分不清继承和访问权限的问题; 子类可以继承父类所有的成员; 但是对private这样的,没有访问权。 链接:https://www.nowcoder.com/questionT...
说法
不
正确
的是_在Excel中,
下面
说法
不
正确
的是?
计算机等级考试详解:在Excel中,
下面
说法
不
正确
的是?本经验由宗龙龙原创,全文共1000多字,阅读需要14分钟,如果文中存在错误,还请大家多多指点,我会积极改进的!6.在Excel中,
下面
说法
不
正确
的是()。 A.Excel应用程序可同时打开多个工作簿文档 B.在同一工作簿文档窗口中可以建立多张工作表 C.在同一工作表中可以为多个数据区域命名 D.Excel新建工作簿的缺省名为“文档1” (图片...
下面
关于@resource注解
说法
正确
的是_【每日一题】关于丁酸乙酯的
说法
正确
的是...
饮料中的果味大多来自酯类。丁酸乙酯(C6H12O2)是无色具有菠萝香味的液体,常用作食品、饮料的调香剂。关于丁酸乙酯
说法
正确
的是( )A.相对分子质量为116gB.由20个原子构成C.分子中碳、氢、氧原子的个数比为3:6:2D.氢元素质量分数最小别偷懒哦做完了才能看答案!答案:D【解析】试题分析:A、相对分子质量单位是“1”,不是“克”,常常省略不写,故选项
说法
错误。B、丁酸乙酯是由...
下面
关于@resource注解
说法
正确
的是_在Excel中,
下面
说法
不
正确
的是?
计算机等级考试详解:在Excel中,
下面
说法
不
正确
的是?本经验由宗龙龙原创,全文共1000多字,阅读需要14分钟,如果文中存在错误,还请大家多多指点,我会积极改进的!6.在Excel中,
下面
说法
不
正确
的是()。 A.Excel应用程序可同时打开多个工作簿文档 B.在同一工作簿文档窗口中可以建立多张工作表 C.在同一工作表中可以为多个数据区域命名 D.Excel新建工作簿的缺省名为“文档1” (图片...
C++ 语言
65,211
社区成员
250,514
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章