为什么__last__元素需要c struct padding

tus*_*ars 3 c struct alignment padding

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

我的问题是结构,

struct my_struct {
   int a;
   char c;
};
Run Code Online (Sandbox Code Playgroud)

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

int g_int1;
struct my_struct st;
int g_int2;
Run Code Online (Sandbox Code Playgroud)

通过以上我的意思是我的其余变量声明不依赖于先前变量大小的单词align-ness.编译器总是尝试对齐下一个变量,而不管其全局或局部自动变量.

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

什么能有正当理由?

Oli*_*rth 9

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

my_struct array[2];
Run Code Online (Sandbox Code Playgroud)

然后array[0]将是单词对齐,但array[1]不会.(回想一下,通过向sizeof(array[0])第一个元素的地址添加多个数组来完成数组查找.)


Ale*_*nze 6

想象一下,你有一个阵列struct my_struct.如果它们的大小不是每个单词的倍数,它的元素将如何对齐?