我很想知道类将如何安排在内存中。具有继承和虚拟功能。继承类的内存布局
我知道这不是由C++语言标准定义的。但是,是否有任何简单的方法可以通过编写一些测试代码来找出特定的编译器如何实现这些说明?
编辑: - 使用下面的一些答案: -
#include <iostream>
using namespace std;
class A {
public:
int a;
virtual void func() {}
};
class B : public A {
public:
int b;
virtual void func() {}
};
class C {
public:
int c;
virtual void func() {}
};
class D : public A, public C {
public:
int d;
virtual void func() {}
};
class E : public C, public A {
public:
int e;
virtual void func() {}
};
class F : public A {
public:
int f;
virtual void func() {}
};
class G : public B, public F {
public:
int g;
virtual void func() {}
};
int main() {
A a; B b; C c; D d; E e; F f; G g;
cout<<"A: "<<(size_t)&a.a-(size_t)&a<<"\n";
cout<<"B: "<<(size_t)&b.a-(size_t)&b<<" "<<(size_t)&b.b-(size_t)&b<<"\n";
cout<<"C: "<<(size_t)&c.c-(size_t)&c<<"\n";
cout<<"D: "<<(size_t)&d.a-(size_t)&d<<" "<<(size_t)&d.c-(size_t)&d<<" "<<(size_t)&d.d- (size_t)&d<<"\n";
cout<<"E: "<<(size_t)&e.a-(size_t)&e<<" "<<(size_t)&e.c-(size_t)&e<<" "<<(size_t)&e.e- (size_t)&e<<"\n";
cout<<"F: "<<(size_t)&f.a-(size_t)&f<<" "<<(size_t)&f.f-(size_t)&f<<"\n";
cout<<"G: "<<(size_t)&g.B::a-(size_t)&g<<" "<<(size_t)&g.F::a-(size_t)&g<<" " <<(size_t)&g.b-(size_t)&g<<" "<<(size_t)&g.f-(size_t)&g<<" "<<(size_t)&g.g-(size_t)&g<<"\n";
}
,输出是: -
A: 8
B: 8 12
C: 8
D: 8 24 28
E: 24 8 28
F: 8 12
G: 8 24 12 28 32
因此所有的类都在大小为8的LOC 0获得了V-PTR D在位置16处有另一个v-ptr。类似地对于E. G在16处似乎也具有v-ptr,但是从我的(有限的)理解中,我会猜测它具有更多。
+1这个示例代码与我想出的最接近。尽量避免依赖内存布局。不能保证它在未来版本的编译器(或者甚至在具有相同编译器版本的其他上下文中,例如优化)中保持不变。我敢打赌,几乎总是有更好的方法来解决这个问题。 – Andre 2011-12-29 19:26:02
谢谢。这确实有点帮助。结合你的答案和Azza的... 我也有兴趣会发生什么,如果我们有 A类; B类; B类; C类:公共A,公共B; 这似乎给出了有多个vtable指针的结果。 A的数据成员似乎先于B. – owagh 2011-12-29 19:38:26
我从来没有处理过多重继承。但你仍然可以尝试看看补偿显示的是什么。我真的不知道多重继承如何在底下工作。 – Mysticial 2011-12-29 19:40:57