gpt4 book ai didi

c - 在打包结构的末尾对齐

转载 作者:行者123 更新时间:2023-12-02 08:58:15 26 4
gpt4 key购买 nike

有没有办法只在打包结构的末尾制作 gcc pad?

我使用打包结构进行空间优化,但也使用该结构来计算内存偏移(在缓冲区中存储多个结构)。因此,如果我的结构体的总大小未对齐(比如说不是 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 匹配,但我正在寻找一种解决方案,无需手动计算尺寸和填充(例如,如果我将来必须添加另一个属性)。

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

最佳答案

这个技巧怎么样

union __attribute__ ((packed)) struct_union
{
struct my_packed_struct data;
int pad[(sizeof(my_packed_struct)+3)/sizeof(int)];
} struct_union;

并直接使用 struct_union 而不是 my_packed_struct?

为什么它会起作用?

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

关于c - 在打包结构的末尾对齐,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42255481/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com