决定类对象在空间中的大小的因素
行也成文 9/15/2019
- 空间对齐
- 虚函数
- 虚继承
- 还有的我也不清楚
# 空间对齐
对象在内存中的空间是以一组一组的形式分配的。也就是说比如当一个类里有一个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;
}
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
x | x | x | x | ||||
---|---|---|---|---|---|---|---|
为什么会比预想的12字节多用了四个字节呢?这就与刚刚提到空间对齐有关。在上述一个int与一个double的组合中,内存空间是以8字节为一组来分配的。double类型的变量8字节刚好占用一组,但int类型的变量只用得到4字节,那么这一行中剩下的4字节怎么办呢?空着。是空间对齐造成了这样一种现象。
这里就有个很有意思的现象。
在介绍例子之前不妨先来看看下面的一段代码。
#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;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
来猜一猜输出结果。
你的答案:xx xx xx
上面的输出结果是
16
24
16
1
2
3
2
3