结构体内存对齐的计算

在这里插入图片描述

对齐规则

+ 结构体变量的起始地址能够被其最宽的成员大小整除;

  • 结构体每个成员相对于起始地址的偏移能够被min(对齐系数, 自身大小整除),如果不能则在前一个成员后面补充字节。其实就是前面所用的字节数必须是当前成员自身大小的整数倍。
  • 结构体总体大小能够被最宽的成员的大小整除,如不能则在后面补充字节。
  • 其实这里有点不严谨,编译器在编译的时候是可以指定对齐大小的,实际使用的有效对齐其实是取 min(最大字节, 对齐系数),一般默认的对齐系数大小是4。

假设对齐系数是 8

如 E1:a 使用 4 个字节,然后 b 使用 1 个字节,4 是 1 的整数倍,所以此时所用字节数为 5,再往后 c 也使用 1 个字节,同理。所以最后 struct 为 6 字节,但这里必须是 4 的倍数 (第 2 条),所以最后是 8 字节。

如 E5 与 E6,很容易得到大小分别为 6 和 3,因为最后对齐是取 min(1, 8)

如 E7:有 E5 占用 6 字节,然后 E6 占用 3 字节,6 是 3 的倍数,所以此时结构体所用字节数为 9,再然后 long long 是 8 字节,所以前面会补 7 个字节 (min(8, 8)),最终是 16 + 8 = 24 字节,此时正好是 4 的整数倍,所以最后为 24 字节。

 

假设对齐系数是 4

如 E7:那么就是,E5 占 6 字节 (满足条件 1),然后 E5 占 3 字节 (满足条件 1,因为 6 是 min(4, 3) 的整数倍),然后 long long 占 8 字节,此时不满足条件 1,(9 需要补成 min(4, 8) 的整数倍),所以最后占 12 + 8 = 20 字节。
在这里插入图片描述
 

可以通过 #pragma pack(n) 将对齐系数设置为 n

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章