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

更新日期: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>

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

友情链接更多精彩内容