首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

C++虚继承内存布局-sizeof(类对象)疑惑求解,该怎么解决

2012-05-27 
C++虚继承内存布局--sizeof(类对象)疑惑求解C/C++ code#includeiostreamusing namespace stdclass a{[c

C++虚继承内存布局--sizeof(类对象)疑惑求解

C/C++ code
#include<iostream>using namespace std;class a{  [color=#FF0000]int x;[/color]  virtual void func(){};};class b:public virtual a{};int main(){  a A;  b B;  cout<<sizeof(A)<<endl;  cout<<sizeof(B)<<endl;  return 0;}

以上代码执行结果为:(注:32位系统,G++ 4.3.2)
4
8

C/C++ code
#include<iostream>using namespace std;class a{  virtual void func(){};};class b:public virtual a{};int main(){  a A;  b B;  cout<<sizeof(A)<<endl;  cout<<sizeof(B)<<endl;  return 0;}

但这段代码执行结果却为:
4
4
为什么这跟第一段代码执行结果不相同呢?

[解决办法]
我在vc6.0中运行
第一段代码
8
12
第二段代码
4
8

第一段代码
对象A中有一个虚表指针vptr和int x所以大小为8
对象B中有一个虚基类指针vbptr和一个虚表指针vptr和一个int x所以大小为12

第二段代码
对象A中只有一个虚表指针vptr 所以大小为4
对象B中有一个虚基类指针vbptr和一个虚表指针vptr 所以大小为8

这些都是在vc6.0中结果
有什么不对请指出
[解决办法]
类的大小应该和编译器的实现有关。主要差异反应在虚函数表的那个入口指针的设计上。我知道有两种编译器。有一种会共用虚函数表的入口,这样size 的大小就小 。有些是每个类都有虚函数表(或者是偏移大小),那么每个类根据继承关系就有多个入口指针,这样每继承一层就会多4个size。这种现象主要是要适应强制转换的需要,所以 c++中少写强制转换很重要。
上面的现象我解释的话就是 第一种情况因为定了 成员变量。所以编译器考虑到实现的难度,a和b的类均有一个虚函数表指针,所以我觉得输出应该是 8(4size的成员变量 4size的表指针),12(4size成员变量 2*4 size的表指针,也可能一个4size的表指针,然后是一个4size的记录a虚函数表在b虚函数表中的偏移)
而第二种现象应该是 4,4,第二种现象在有的编译器上也可能是4,8

我说的也可能不对,因为我只是看过一点编译的书籍,凭多年的c++工作猜测。毕竟没有实现过c++编译器。大家探讨一下

热点排行