结构体对齐?

0

记得计组考试时候遇到过一道题, 计算结构体所占的内存大小, 当时错了, 但是后来也没明白是为什么而错。 今日转而学习了一波, 渐渐解开了一些疑惑

结构体大小的计算公式

结构体大小 = sizeof(数据成员1) + sizeof(数据成员2) + sizeof(数据成员3) + ...

按照道理来说这个公式是没问题的, 但是问题就在这里

内存对齐

VC++ 6.0 指定的默认对齐值为8

规则1

在为结构体中的数据成员分配内存时, 结构体中当前数据成员类型长度为M, 指定的对齐值为N, 那么实际对齐值为q = min(M, N), 其成员的地址安排在q的倍数上。

比如如下代码:

struct tagTEST{
  short sShort;
  int nInt;
};

很显然, sShort 本来占 2 个字节, 以 2 对齐, 所以只需地址起始部分是2的倍数, 但是下一个数据成员 nInt 应该占用 4 个字节, 故地址应该是 4 的倍数。 所以 在 sShort 之后需要填充两个字节, 来满足对齐条件。

规则2

其实可以发现, 对齐的目标就是使得结构体的整体大小能够被8整除。

如下代码:

struct {
  double dDouble;
  int nInt;
  short sShort;
};

显然, dDouble 占8个字节, nInt 占4个字节, 所以最后的 sShort 必须占用4个字节, 也就是有两个字节是被填充的, 这样才能满足 结构体的大小能够被 8 整除

规则3

并非设定了默认对齐值, 就能将结构体的对齐值锁定, 如果结构体中的数据成员类型最大值为M, 指定的默认对齐值为N, 那么实际对齐值为 min(M, N)

如下代码:

struct {
  char cChar;
  int iInt; 
  short sShort;
}

如果是按照8字节对齐, 由规则1 cChar 应该占用 4个字节, nInt 占用 4个字节, 那么sShort 应该占用 8个字节才对, 因为要满足 结构体的大小被8整除嘛。 但是编译器会发现 结构体中最大的 nInt 占4字节空间, 于是对齐值调整为 4 , 从而 sShort 只需要 4字节就够了, 也就是说 只需要额外占用 2个字节。

自定义默认对齐值

#pragma pack(N)

数组来了如何处理?

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

相关阅读更多精彩内容

  • 转载 结构体对齐详解 结构体数据成员对齐的意义 许多实际的计算机系统对基本类型数据在内存中存放的位置有限制,它们会...
    erU阅读 3,328评论 0 3
  • 1.为什么要对齐 理论上对任何变量的访问可以从任何地址开始,实际情况是在访问特定类型变量的时候经常在特定的内存地址...
    Lazy_Caaat阅读 3,287评论 0 1
  • @[c++|struct] 今天在编程中碰到一个坑,搞的调试了半天,最后发现程序中在写数据和读取数据时结构体定义不...
    drybeans阅读 9,111评论 1 11
  • 一醉笑红尘 世间逍遥人 无情女人好 不会被伤心
    枯叶萧瑟阅读 4,536评论 27 23
  • 五年前你的离开不声不响,就此我们断了联系。你以为这就是结束,这就是再见吗?不,我和你没完…… ...
    浅草夏沫阅读 2,738评论 8 11

友情链接更多精彩内容