c++虚继承的内存问题
来源:互联网 发布:lol域名可以备案吗 编辑:程序博客网 时间:2024/06/05 07:38
转自:http://zhidao.baidu.com/question/249749363.html
#include<iostream>using namespace std;class A{};class B{};class C:public virtual A,public virtual B{};int main(){ cout<<sizeof(C); return 0;}输出是8#include<iostream>using namespace std;class A{void virtual fun(){}};class B{void virtual fun(){}};class C:public A,public B{};int main(){ cout<<sizeof(C); return 0;}输出是 8但是#include<iostream>using namespace std;class A{void virtual fun(){}};class B{void virtual fun(){}};class C:public virtual A,public virtual B{};int main(){ cout<<sizeof(C); return 0;}却输出是12 按理应该是16吧 我用的是vc6.0编译器 望高手给我解决这个问题
--------------------------------------------
回答:
sizeof(A) + sizeof(B) + sizeof(class_ptr)class_ptr即类指针,指向virtual说明的虚基类列表注意,这里面存在内存对齐规则第一个代码:sizeof(A) + sizeof(B) + sizeof(class_ptr) = 1 + 1 + 4, 对齐,得到8第二个代码:sizeof(A) + sizeof(B) = sizeof(vptr) + sizeof(vptr) = 4 + 4 = 8,虚函数表指针第三个代码:sizeof(A) + sizeof(B) + sizeof(class_ptr) = 4 + 4 + 4 = 12就是在第二个的基础上多了一个class_ptr,无论多少个类,都只有一个class_ptr指向这一系列的virtual class。(注意,这很关键。类指针,也即虚基指针,vbptr,是一个用来获得虚基类位置离当前类对象位置偏移的指针,自身位置信息在vtable中虚基类位置信息的下一行给出。可参考http://blog.csdn.net/onlyonename/article/details/8062756。至于为什么多个虚继承只有一个类指针,人个猜可能是各个虚基类的位置按书写的继承先后顺序依次存放在vtable中,类指针指向表中第一个书写的虚基类。相关参考文献有http://blog.csdn.net/onlyonename/article/details/8068871,http://blog.csdn.net/onlyonename/article/details/8068990,http://blog.csdn.net/onlyonename/article/details/7040913,http://blog.csdn.net/onlyonename/article/details/7041115,http://blog.csdn.net/onlyonename/article/details/7041255 by orc)追问
回答
追问
回答
- 继承的内存问题
- C++ 多继承和虚继承的内存布局
- c++虚继承的内存问题
- 继承时的内存问题
- c++-关于菱形继承&虚继承的问题总结
- 一个C C++ 内存的问题 和 C++继承 虚函数表的点【2013.10.15小记】
- 【C++】虚函数和虚继承的内存分布情况
- C++(虚)继承类的内存占用大小
- C++(虚)继承类的内存占用大小
- 继承CWinThread类的内存泄露问题
- 【c++】深度探索虚继承内存布局
- C的内存分配问题
- c的内存分配问题
- C的内存分配问题
- 接口继承的声明问题 [C#, BCL]
- 【C++】c++单继承、多继承、菱形继承内存布局(虚函数表结构)
- 【C++】c++单继承、多继承、菱形继承内存布局(虚函数表结构)
- (C++)继承、菱形继承和虚继承的那些事儿
- ORA-01950: 对表空间 'USERS' 无权限
- jbpm5学习资料(脚本任务scriptTask)
- 参数NLS_LENGTH_SEMANTICS的设置问题
- asp.net响应回车事件(包含模板页和非模板页)
- 嵌入式Linux之我行--内核I2C子系统详解
- c++虚继承的内存问题
- jbpm5学习资料(评估)
- 信号量,互斥锁和条件变量之间的差异
- 字符串匹配之通配符问题------一串首尾相连的珠子(m个),有N种颜色(N《=10),设计一个算法,取出其中一段,要求包含所有N中颜色,并使长度最短。
- jbpm5学习资料(触发事件)
- linux中mysql重启问题
- Android中如何检测重力感应变化:Sensor和SensorManager
- 使用MFC创建一个分隔的窗口的步骤
- UVa 10305 - Ordering Tasks