我正在查看一些为 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位架构下在内存中的结构为(~= 填充):
+---------+---------+
| m1 |~~~~| m2 |
+---------+---------+
当结构被打包时,不会插入这些填充。编译器必须生成更多代码(运行速度较慢)来提取未对齐的数据成员,并写入它们。
打包后,相同的结构将在内存中显示为:
+---------+---------+
| m1 | m2 |~~~~
+---------+---------+
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)