如果有一个C
结构,如
struct abc
{
uint16_t port_no; //2 Bytes
uint8_t src_mac[6]; //6 Bytes
}
编译器将如何在32位sys上应用填充以对齐到4字节字:
会是
2 Bytes
Pad[2]
6 Bytes
Pad[2]
或
2 Byte
6 Byte
答案 0 :(得分:0)
这取决于系统的体系结构。
在32位MIPS上,您的结构将没有
进行填充,因为uint16_t
必须对齐
甚至地址和uint8_t
都不需要对齐。
但是类型struct abc
的变量将对齐
甚至地址,从而最终迫使填充
结构(例如,struct abc
是周围结构的成员时)。
答案 1 :(得分:0)
在C / C ++中,每种类型的大小和对齐方式可能因体系结构,体系结构,内核甚至C / C ++ ABI的不同而不同。
Gcc提供了一个功能__alignof__
,而C ++ 11正式具有一个alignof(type-id)
功能,可用于打印类型的对齐要求。普通C似乎没有,但是每种类型仍然具有该属性。
在内存中,每种类型都必须至少符合对齐要求,并且编译器会将填充插入结构中,以确保确实如此。这样,该结构整体将具有其任何成员所需的最大对齐方式,其大小包括填充至该结构的对齐方式的倍数。
通常,uint16_t具有2字节的资格要求,并具有1字节的对齐要求。因此该结构具有2字节对齐要求,并且根本不需要填充。该结构的总大小为8字节。
但是请注意,由于某种原因,体系结构的调用约定可能需要更多的对齐或填充。
答案 2 :(得分:-1)
填充默认为打开状态。它将“间隙”自动插入到您的结构中。结果好像有第四个中间变量,像这样:
struct abc
{
uint16_t port_no; // 2 Bytes
char pad_0[2]; // 2 Bytes
uint8_t src_mac[6]; // 6 Bytes
char pad_1[2]; // 2 Bytes
}