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

时间:2014-08-13 02:00:19

标签: memory memory-address

结构是,

struct { 
    char a;
    short b; 
    short c; 
    short d; 
    char e;
} s1;

short的大小以2个字节给出 char的大小为1个字节 它是一个32位的LITTLE ENDIAN处理器

据我所知,答案应该是:

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个字节

2 个答案:

答案 0 :(得分:1)

这里的答案是,结构的布局完全取决于编译器。

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

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

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

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

答案 1 :(得分:1)

C标准说(抱歉,不是在我的电脑上,所以没有引用):结构与最大(基本类型)成员的对齐方式对齐。你最大的成员字段是一个短的2字节,所以第一个元素' a'在偶数地址对齐。 '一个'占用1个字节。 ' B'必须在偶数地址处再次对齐,因此浪费了一个字节。结构的最后一个元素' e'也是一个字节,后面的字节很可能被浪费,但这不必显示在结构的大小。如果把' a'到最后,即重新排列成员,你可能会发现你的结构的大小是8个字节......这是最好的。