更新日期:2019-09-15
- 空间对齐
- 虚函数
- 虚继承
- 还有的我也不清楚
空间对齐
对象在内存中的空间是以一组一组的形式分配的。也就是说比如当一个类里有一个4B的int类型与一个8B的double类型的非静态属性时,占用的空间不是4 + 8 = 12,而是8 * 2 =16。内存中的分布方式类似于(x代表未被占用的空间,一个格子代表一个字节):
class h {
private:
int x;
double y;
};
int main() {
std::cout << sizeof(h); // 16
return 0;
}
假设这是系统的空间,按8个字节为一组来分配
| | | | | x | x | x | x |
————————————————————————————————————————-
| | | | | | | | |
画 ‘x’ 的格子表示空
为什么会比预想的12字节多用了四个字节呢?这就与刚刚提到空间对齐有关。
在上述一个 int
与一个 double
的组合中,内存空间是以 8字节 为一组来分配的。double
类型的变量 8 字节 刚好占用一组,但 int
类型的变量只用得到 4 字节,那么这一行中剩下的 4 字节怎么办呢?空着(画 'x' 的格子)。
空间对齐造成了这样一种很有意思的现象。
一起来看看下面的一段代码。
#include <iostream>
class A {
private:
int x;
int y;
double z;
};
class B {
private:
int x;
double z;
int y;
};
class C {
private:
double z;
int x;
int y;
};
int main() {
std::cout << sizeof(A) << std::endl; // ?
std::cout << sizeof(B) << std::endl; // ?
std::cout << sizeof(C) << std::endl; // ?
return 0;
}
来猜一猜输出结果。
你的答案:xx xx xx
<details>
<summary>展开查看</summary>
上面的输出结果是
16
24
16
对了,C 中的结构体也有类似的机制
</details>