空类
class CAnimal
{
};
void memory_layout()
{
CAnimal animal;
cout << "sizeof(animal) = " << sizeof(animal) << endl;
}
output:
sizeof(animal) = 1
总结:
- 空对象本不占用任何内存空间,其字长应为0,但对象有相应地址又必须占用内存空间,因此编译器分配了最小的内存长度1,而该内存空间中1字节的数据无意义,仅仅表示对象地址
简单类
class CAnimal
{
public:
int mGroup;
int mColor;
};
void memory_layout()
{
CAnimal animal;
cout << "sizeof(animal) = " << sizeof(animal) << endl;
cout << "mGroup Offset = " << (char*)&animal.mGroup - (char*)&animal << endl;
cout << "mColor Offset = " << (char*)&animal.mColor - (char*)&animal << endl;
}
output:
sizeof(animal) = 8
mGroup Offset = 0
mColor Offset = 4
总结:
- 内存布局按照数据成员定义顺序
- 内存布局遵守内存对齐规则
含虚函数类
class CAnimal
{
public:
virtual void feed()
{
}
public:
int mGroup;
int mColor;
};
void memory_layout()
{
CAnimal animal;
cout << "sizeof(animal) = " << sizeof(animal) << endl;
cout << "mGroup Offset = " << (char*)&animal.mGroup - (char*)&animal << endl;
cout << "mColor Offset = " << (char*)&animal.mColor - (char*)&animal << endl;
}
output:
sizeof(animal) = 16
mGroup Offset = 8
mColor Offset = 12