如何计算这个特定结构体的大小和布局?



结构为,

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]

size = 9 bytes

但是根据解决方案,S1的大小应该是10字节

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

10可能是该结构最常见的大小。

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

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

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

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

最新更新