什么是C中的“打包”结构?

我将为Microchip C30编译器编写一些C代码,我经常看到如下定义的结构:

typedef struct __attribute__((__packed__)) { IP_ADDR MyIPAddr; // IP address IP_ADDR MyMask; // Subnet mask IP_ADDR MyGateway; // Default Gateway // etc... } APP_CONFIG; 

包装是什么意思?

定义结构时,允许编译器添加填充(没有实际数据的空格),以便成员落入更容易访问CPU的地址边界。

例如,在32位CPU上,32位成员应从4个字节的多个地址开始,以便有效地访问(读取和写入)。 以下结构定义在两个成员之间添加了一个16位填充,以便第二个成员落在适当的地址边界:

 struct S { int16_t member1; int32_t member2; }; 

在32位架构中上述结构的存储器结构是( = padding):

 +---------+---------+ | m1 |~~~~| m2 | +---------+---------+ 

当打包结构时,不插入这些填充。 编译器必须生成更多代码(运行速度较慢)以提取未对齐的数据成员,并写入它们。

打包时,相同的结构将在内存中显示为:

 +---------+---------+ | m1 | m2 |~~~~ +---------+---------+ 

它指示编译器不在struct成员之间添加任何填充。

例如,请参阅此页面 。

_attribute__((__packed__))意味着(最有可能)“不插入任何填充以使事情更快”,也可能意味着“不要插入任何对齐以保持对齐”。