C 在压缩结构的末尾对齐
有没有办法只在打包结构的末尾制作gcc焊盘 我使用压缩结构进行空间优化,但也使用该结构计算内存偏移量(在缓冲区中存储多个结构)。因此,如果我的结构的总大小没有对齐(比如说不是4的倍数),如果我尝试访问缓冲区中的以下结构,我将得到一个SIGBUS 例如 如果我把一个my_-packed_结构放在地址0x2000,那么我也会把另一个_结构放在0x200B(+11字节) 因此,如果我想访问另一个结构,例如(other_struct*)0x200B,我会得到一个SIGBUS 所以我很好奇,是否有办法让GCC填充结构来避免这个问题 定义如下:C 在压缩结构的末尾对齐,c,gcc,memory-alignment,C,Gcc,Memory Alignment,有没有办法只在打包结构的末尾制作gcc焊盘 我使用压缩结构进行空间优化,但也使用该结构计算内存偏移量(在缓冲区中存储多个结构)。因此,如果我的结构的总大小没有对齐(比如说不是4的倍数),如果我尝试访问缓冲区中的以下结构,我将得到一个SIGBUS 例如 如果我把一个my_-packed_结构放在地址0x2000,那么我也会把另一个_结构放在0x200B(+11字节) 因此,如果我想访问另一个结构,例如(other_struct*)0x200B,我会得到一个SIGBUS 所以我很好奇,是否有办法让G
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匹配,但我正在寻找一种不必手动计算大小和填充的解决方案(例如,如果将来必须添加另一个属性)
我看了一下,我确实在内部将结构存储在缓冲区中,但是为了方便和客户端使用,我仍然需要公开一个结构。这个技巧怎么样
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
为什么它会起作用
。。。对于空间优化,
首先:不要使用bool。将bool&char字段放在相邻的位置,这样它们只需要对齐一次。我假设这是针对嵌入式系统的,否则即使创建了数百万个结构,也不必只保存几个字节。至于您的问题,other_struct
是否必须紧跟在打包结构之后?为什么不把它放在打包结构之后一个对齐得很好的地址呢?然后填充将是两个结构之间的空白。哦,还有另一件事,你可能把other_结构
放在0x200B
对吗?否则你会有重叠。手动添加一个pad bye?@Someprogrammerdude是的,它用于嵌入式系统,是的,你是对的,它是0x200B。其他结构必须遵循其他结构(基本上是标头/有效负载)。另外,我不想让编写器承担对齐结构的负担。您应该将3
替换为sizeof(int)-1
(或者不管3的来源是什么)是-3是sizeof(int)-1。int也可以用其他类型替换,但问题是关于4字节对齐。
union __attribute__ ((packed)) struct_union
{
struct my_packed_struct data;
int pad[(sizeof(my_packed_struct)+3)/sizeof(int)];
} struct_union;