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”类型值?