空间对齐:C++决定对象在空间中的大小的重要因素

159 阅读1分钟
  • 空间对齐
  • 虚函数
  • 虚继承
  • 还有的我也不清楚

空间对齐

对象在内存中的空间是以一组一组的形式分配的。也就是说比如当一个类里有一个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 |
————————————————————————————————————————-
|    |    |    |    |    |   |   |   |

为什么会比预想的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

展开查看 上面的输出结果是
16
24
16

对了,C 中的结构体也有类似的机制