C++ 内存对齐-结构的总大小是结构对齐的倍数,而不是处理大小
在上一篇文章中,我已经理解了为什么我们必须对一个等于最大属性大小的结构进行对齐 现在,我想知道为什么,一旦我们选择了这种对齐方式,我们就必须进行填充,以便总结构大小是结构对齐的倍数,而不是处理器字大小 这里有一个例子:C++ 内存对齐-结构的总大小是结构对齐的倍数,而不是处理大小,c++,c,memory-alignment,C++,C,Memory Alignment,在上一篇文章中,我已经理解了为什么我们必须对一个等于最大属性大小的结构进行对齐 现在,我想知道为什么,一旦我们选择了这种对齐方式,我们就必须进行填充,以便总结构大小是结构对齐的倍数,而不是处理器字大小 这里有一个例子: #include <stdio.h> // Alignment requirements // (typical 32 bit machine) // char 1 byte // short int 2 bytes // int
#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;
}
因为我们采用了等于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
感谢您的帮助考虑一下
结构数组[n]
。如果结构的大小是20(不是8的倍数),则第二个元素在4字节边界对齐
澄清一下:让
array[0]
位于地址0
。如果结构的大小是20
,array[1]
从地址20
开始,它的d
降落在地址28
,这对双人房来说不是一个合适的对齐方式。我不明白你说的是什么意思“第二个元素在一个4字节的边界上对齐”,你能更精确地解释一下吗?正如你所说,这个结构需要8字节对齐。它也必须在数组中对齐。因此,它的大小必须是8的倍数。
char c;
char Padding1[7]
double d;
int s;