Memory 如何计算此特定结构的大小和布局?

Memory 如何计算此特定结构的大小和布局?,memory,memory-address,Memory,Memory Address,结构是, struct { char a; short b; short c; short d; char e; } s1; short的大小以2字节表示 字符大小以1字节表示 它是一个32位的小端处理器 我认为答案应该是: 1000 a[0] 1001 offset 1002 b[0] 1003 b[1] 1004 c[0] 1005 c[1] 1006 d[0] 1007 d[1] 1008

结构是,

struct { 
    char a;
    short b; 
    short c; 
    short d; 
    char e;
} s1;
short的大小以2字节表示 字符大小以1字节表示 它是一个32位的小端处理器

我认为答案应该是:

1000    a[0]
1001    offset
1002    b[0]
1003    b[1]
1004    c[0]
1005    c[1]
1006    d[0]
1007    d[1]
1008    e[0]
S1的大小=9字节​


但是根据解决方案,S1的大小应该是10个字节。这里的答案是结构的布局完全由编译器决定

10可能是这种结构最常见的尺寸

填充的原因是,如果存在数组,它将保持所有成员正确对齐。如果大小为9,则其他每个数组元素都会有未对齐的结构成员

某些系统上不允许未对齐的did访问。在大多数系统上,它们会导致处理器使用额外的周期来访问数据


编译器可以为这种结构中的每个元素分配4个字节。

C标准说(对不起,不是在我的计算机上,所以没有引号):结构与最大(基类型)成员的对齐方式对齐。最大的成员字段是一个短的2字节,因此第一个元素“a”在偶数地址对齐“占用1字节。”b'必须在偶数地址处再次对齐,因此浪费了一个字节。结构“e”的最后一个元素也是一个字节,后面的字节可能会被浪费,但不必显示在结构的大小中。如果将“a”放在末尾,即重新排列成员,您很可能会发现结构的大小为8字节。这是最好的结果。

我想下面的链接可能会回答您的问题。谢谢你的链接,但是为什么struct的大小必须是2的倍数呢?是否因为结构的最大成员是大小为2的“short”类型值?