C++虚继承内存布局-sizeof(类对象)疑惑求解,该怎么解决
C++虚继承内存布局--sizeof(类对象)疑惑求解
以上代码执行结果为:(注:32位系统,G++ 4.3.2)
4
8
但这段代码执行结果却为:
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++编译器。大家探讨一下
- 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++编译器。大家探讨一下