我知道填充及其规则,为什么需要等等。
我的问题是结构,
struct my_struct {
int a;
char c;
};
在这种情况下,c的起始地址是字对齐,但仍然编译器添加了3个字节(假设为字大小为4)填充。在c之后没有元素,为什么我们需要这3个字节? 我查了下来,
int g_int1;
struct my_struct st;
int g_int2;
上面我的意思是我的其余变量声明不依赖于先前变量大小的单词align-ness。编译器总是尝试对齐下一个变量,而不管其全局或局部自动变量。
我看不出任何有关endian-ness的原因,因为这是char而且对于一个字节它并不重要。我认为是什么原因而不是检查最后一个元素条件编译器总是在需要时添加填充。
什么能有正当理由?
答案 0 :(得分:9)
因为如果sizeof(my_struct)
是5而不是8,那么如果你这样做了:
my_struct array[2];
然后array[0]
将按字对齐,但array[1]
不会。 (回想一下,通过将sizeof(array[0])
的倍数添加到第一个元素的地址来完成数组查找。)
答案 1 :(得分:6)
想象一下,你有一个struct my_struct
的数组。如果它们的大小不是每个单词的倍数,它的元素将如何对齐?
答案 2 :(得分:1)
要使对象大小也对齐。想象一下有一个my_structs数组。在这种情况下,您需要对齐每个元素的起始地址。因此sizeof(struct my_struct)必须“对齐”。否则,您无法分辨需要分配多少内存。