gpt4 book ai didi

c - 什么是 C 中的 "packed"结构?

转载 作者:太空狗 更新时间:2023-10-29 16:22:42 25 4
gpt4 key购买 nike

我正在浏览一些为 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 |~~~~
+---------+---------+

关于c - 什么是 C 中的 "packed"结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5473189/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com