决定类对象在空间中的大小的因素

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
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

来猜一猜输出结果。

你的答案:xx xx xx

上面的输出结果是

16
24
16
1
2
3
Last Updated: 10/23/2021, 4:31:30 PM