无论如何只在打包结构的末尾制作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,我在内部将结构存储在缓冲区中,但为了方便和客户端使用,我仍然需要公开结构。
答案 0 :(得分:1)
这个技巧怎么样?
map
并直接使用struct_union而不是my_packed_struct?
为什么它会起作用?