内存对齐-结构的总大小是结构对齐的倍数,而不是处理大小
memory alignment- total size of structure multiple of structure alignement and not processing size
在上一篇文章中,我理解了为什么我们必须对等于最大属性大小的结构进行对齐。
现在,我想知道为什么,一旦我们选择了这种对齐,我们就必须进行填充,使总结构大小是结构对齐的倍数,而不是处理器字大小。
这里有一个例子:
#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) = %dn", sizeof(structd_t));
return 0;
}
我们可以认为struct_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
。如果结构的大小是20
,则array[1]
从地址20
开始,并且它的d
在地址28
着陆,这对于双精度来说不是合适的对准。
相关文章:
- 我可以检测和更改 gcc/g++ 中结构的当前数据对齐设置吗?
- 在 64 位边界上对齐C++结构数组?
- 初始化派生结构的基部分/意外打包派生结构字段以对齐基结构的间隙
- 指向包含对齐 C 结构C++类的 C 指针的对齐问题
- C++ 类层次结构中的"对齐"是什么意思?
- 哪些值存储在对齐的结构/类对象的填充字节中
- gcc 是否在 2 条短裤的过度对齐结构的比较中错过了优化机会?
- 在 c++ 中将数据从未对齐结构数组移动到对齐结构数组
- vcpkg:指定结构成员对齐方式
- 使用字节数组具有单字节对齐方式的结构是否安全
- 编译器会秘密增加结构的对齐方式吗?
- OPENCL结构对齐错误
- C++ 编译器正在更改我的结构的对齐方式.我怎样才能防止这种情况
- 对齐构件的对齐结构为成员(C )
- C++对齐结构
- 返回对齐结构后出现分段错误
- 内存对齐-结构的总大小是结构对齐的倍数,而不是处理大小
- 如何对齐结构数组,每个结构都需要对齐(SSE)
- 使用alignas对齐结构
- 分配对齐结构的数组