在打包的结构

时间:2017-02-15 16:53:26

标签: c gcc memory-alignment

无论如何只在打包结构的末尾制作gcc pad?

我正在使用打包结构进行空间优化,但也使用该结构来计算内存偏移量(在缓冲区中存储多个结构)。因此,如果我的结构的总大小没有对齐(不是4的倍数),如果我尝试在我的缓冲区中访问以下结构,我将得到一个SIGBUS。

E.g。

sizeof(my_packed_struct) == 11
sizeof(other_struct) == 12

如果我将my_packed_struct放在地址0x2000,我也会将other_struct放在0x200B(+11字节)。

因此,如果我想访问other_struct,例如(other_struct *)0x200B,我会得到一个SIGBUS。

所以我很好奇是否有办法让GCC填充结构以避免这个问题。

这是定义:

typedef struct __attribute__ ((packed)) my_packed_struct {
    uint8_t att1;
    bool att2;
    uint32_t att3;
    uint32_t att4;
    bool att5;
} my_packed_struct;

我可以添加像

这样的属性
typedef struct __attribute__ ((packed)) my_packed_struct {
    uint8_t att1;
    bool att2;
    uint32_t att3;
    uint32_t att4;
    bool att5;
    uint8_t pad;
} my_packed_struct;

要确保匹配大小12,但我正在寻找一个解决方案,我不必手动计算大小和填充(例如,如果我将来必须添加另一个属性)。

我查看了memory alignment within gcc structs,我在内部将结构存储在缓冲区中,但为了方便和客户端使用,我仍然需要公开结构。

1 个答案:

答案 0 :(得分:1)

这个技巧怎么样?

map

并直接使用struct_union而不是my_packed_struct?

为什么它会起作用?

  1. union已打包,因此不会额外填充
  2. pad将始终是4的倍数(因为int)
  3. sizeof计算将确保它足够大以容纳整个my_packed_struct