打包和解包结构的内存布局

时间:2013-05-08 11:26:31

标签: c memory struct

我有2个结构,如下所示。

#include<stdint.h>
typedef struct
{
   uint32_t a;
   uint8_t b;
   uint8_t pad[3]; //padding here is added intentionally. 
   uint32_t c;
}A;

typedef struct
{
   uint32_t a;
   uint8_t b;
   uint8_t pad[3];
   uint32_t c;
}__attribute__((__packed__)) B;

这两个结构是否保证在所有硬件平台上具有完全相同的内存布局?可以假设编译器始终是gcc。

2 个答案:

答案 0 :(得分:2)

没有。在这个结构的解压缩版本中仍然可以有填充。即使今天没有这样的实现,未来也可能存在一种体系结构 - 当所有类型的类型在与可被128整除的偏移对齐时最优化,并且解压缩版本中的任何成员之后可以是在这样的系统上填充120和96位填充。编译器可能会利用这一点。 Stackoverflow是永远的。

答案 1 :(得分:0)

答案是“可能”但不“保证”,因为所有架构都是一个非常广泛的覆盖范围。我可以设想一些具有内存架构的系统,其读/写性能更倾向于保持读取和写入边界大于uint8_t。

请注意,打包时,编译器将使用对于特定体系结构通常不是最佳的读/写代码,但在访问结构成员方面是正确的。