2

我有 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。

4

2 回答 2

2

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

于 2013-05-08T11:55:46.950 回答
0

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

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

于 2013-05-08T11:36:21.000 回答