32位系统中的结构填充

时间:2018-07-17 08:35:07

标签: c struct padding

如果有一个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

3 个答案:

答案 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
}