class A
{
public:
void test(){}
private:
int a;
double b;
};
class B
{
private:
double a;
int b;
};
这段代码在linux编译:
g++ mem_test.cc -fdump-class-hierarchy
输出:
Class A
size=16 align=8
base size=16 base align=8
A (0x0x7f78d718e960) 0
Class B
size=16 align=8
base size=12 base align=8
B (0x0x7f78d718e9c0) 0
64位机器字节长度8,class A第一个成员变量a 4个字节,然后补齐4个字节;加上double 8个字节,总共16个字节;
class B 8个字节+4个字节,然后补4个字节,总共也是16个字节。
然后我们对class B修改带有虚函数的类:
class A
{
public:
void test(){}
private:
int a;
double b;
};
class B
{
public:
virtual void test(){}
private:
int b;
double a;
};
编译后输出:
Class A
size=16 align=8
base size=16 base align=8
A (0x0x7fcbcb1a24e0) 0
Vtable for B
B::_ZTV1B: 3u entries
0 (int (*)(...))0
8 (int (*)(...))(& _ZTI1B)
16 (int (*)(...))B::test
Class B
size=24 align=8
base size=24 base align=8
B (0x0x7fcbcb1a2540) 0
vptr=((& B::_ZTV1B) + 16u)
class A B含有的成员变量一样,但是B的长度是24,多了8个字节,其实就是多了个virtual table指针的原因,指针8个字节。