c++ - 内存对齐 - 结构对齐的总结构大小,而不是处理大小

标签 c++ c memory-alignment

在之前的帖子中,我理解了为什么我们必须对等于最大属性大小的结构进行对齐。

现在,我想知道为什么,一旦我们选择了这种对齐方式,我们就必须进行填充,以便总结构大小是结构对齐方式的倍数,而不是处理器字大小。

这里有一个例子:

#include <stdio.h>

// Alignment requirements
// (typical 32 bit machine)

// char         1 byte
// short int    2 bytes
// int          4 bytes
// double       8 bytes

typedef struct structc_tag
{
   char        c;
   double      d;
   int         s;
} structc_t;

int main()
{
   printf("sizeof(structd_t) = %d\n", sizeof(structd_t));

   return 0;
}

我们可以认为 structd_t 的大小等于 20 个字节:

   char        c;
   char Padding1[7]
   double      d;
   int         s;

因为我们采用了等于 8(双 d)的结构对齐方式。

但实际上,总大小等于 24,因为 20 不是 8 的倍数,我们必须在“int s”(char Padding2[4]) 之后进行填充。

如果我采用一个结构数组,每个结构的第一个元素对于 32 位处理器(0、20、40)都是很好的地址,因为 20、40 ... 是 4(处理字大小)的倍数。

那么为什么我必须为 8 的倍数(结构对齐)进行填充,即本例中的 24 个字节,而不是 20 个字节(这为 32 位处理器提供了良好的地址(字长 = 4字节):0、20、40 ...?

谢谢你的帮助

最佳答案

考虑struct_t array[n]。如果结构的大小为 20(不是 8 的倍数),则第二个元素在 4 字节边界对齐。

澄清一下:令array[0] 位于地址0。如果结构的大小是 20array[1] 从地址 20 开始,它的 d 落在地址 28,这不是 double 的正确对齐方式。

关于c++ - 内存对齐 - 结构对齐的总结构大小,而不是处理大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26265178/

相关文章:

objective-c - 实例变量声明的顺序在 Objective-C 中重要吗?

linux - 现代cpus如何处理跨页未对齐访问?

c++ - 使用 alignas 防止错误共享被破坏

c++ - 在 C++ 中将字符串和列表添加到映射

c++ - LibTIFF:从 TIFF 图像中提取所有标签

c++ - QListview, QTreeview 是正确的以列表方式显示文件

c - 分配相同类型的值不起作用(需要左值作为一元 '&' 操作数)

android - 在代码中包含 C++ 预处理器指令 - Android NDK

c - 读/写管道是一项昂贵的操作吗?

c - C 中挑剔的 bool 值