我有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。
答案 0 :(得分:2)
没有。在这个结构的解压缩版本中仍然可以有填充。即使今天没有这样的实现,未来也可能存在一种体系结构 - 当所有类型的类型在与可被128整除的偏移对齐时最优化,并且解压缩版本中的任何成员之后可以是在这样的系统上填充120和96位填充。编译器可能会利用这一点。 Stackoverflow是永远的。
答案 1 :(得分:0)
答案是“可能”但不“保证”,因为所有架构都是一个非常广泛的覆盖范围。我可以设想一些具有内存架构的系统,其读/写性能更倾向于保持读取和写入边界大于uint8_t。
请注意,打包时,编译器将使用对于特定体系结构通常不是最佳的读/写代码,但在访问结构成员方面是正确的。