有没有办法让gcc仅在紧凑结构的末尾进行填充?
我正在使用紧凑结构进行空间优化,但也将该结构用于计算内存偏移量(在缓冲区中存储多个结构)。因此,如果我的结构的总大小未对齐(不是4的倍数),如果我尝试访问缓冲区中的下一个结构,我将收到SIGBUS信号。
例如:
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,但我正在寻找一种解决方案,不需要手动计算大小和填充(例如,如果将来必须添加另一个属性)。
我看了gcc结构体中的内存对齐,我确实在内部缓冲区中存储结构体,但我仍然需要暴露一个结构体以方便客户端使用。
other_struct
是否必须直接跟在紧凑结构体后面?为什么不将其放置在紧凑结构体之后一个良好对齐的地址上?然后填充将是两个结构体之间的空白空间。 - Some programmer dudeother_structure
放在0x200B
,对吧?否则就会重叠了。 - Some programmer dude