3

我知道填充,它的规则,它为什么需要等等。

我的问题是结构,

struct my_struct {
   int a;
   char c;
};

在这种情况下, c 的起始地址是字对齐的,但编译器仍然添加了 3 个字节(假设 4 作为字长)填充。c 之后没有元素,为什么我们需要这 3 个字节?我检查了以下,

int g_int1;
struct my_struct st;
int g_int2;

以上我的意思是我的其余变量声明不依赖于先前变量大小的字对齐。编译器总是尝试对齐下一个变量,而不管它的全局或本地自动变量。

我看不出任何字节序的原因,因为这是 char 并且对于一个字节来说并不重要。我认为是什么原因而不是检查最后一个元素条件编译器总是在需要时添加填充。

有什么正当理由?

4

3 回答 3

11

因为如果sizeof(my_struct)是 5 而不是 8,那么如果你这样做:

my_struct array[2];

thenarray[0]将是字对齐的,但array[1]不会。(回想一下,数组查找是通过将 的倍数添加sizeof(array[0])到第一个元素的地址来完成的。)

于 2013-01-30T15:04:17.063 回答
6

想象一下,你有一个数组struct my_struct。如果每个元素的大小都不是单词的倍数,它的元素将如何进行单词对齐?

于 2013-01-30T15:03:17.643 回答
1

它是使对象大小也对齐。想象一下有一个 my_structs 数组。在这种情况下,您需要对齐每个元素的起始地址。因此 sizeof(struct my_struct) 必须“对齐”。否则,您无法确定需要分配多少内存。

于 2013-01-30T15:05:30.883 回答