Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 在压缩结构的末尾对齐_C_Gcc_Memory Alignment - Fatal编程技术网

C 在压缩结构的末尾对齐

C 在压缩结构的末尾对齐,c,gcc,memory-alignment,C,Gcc,Memory Alignment,有没有办法只在打包结构的末尾制作gcc焊盘 我使用压缩结构进行空间优化,但也使用该结构计算内存偏移量(在缓冲区中存储多个结构)。因此,如果我的结构的总大小没有对齐(比如说不是4的倍数),如果我尝试访问缓冲区中的以下结构,我将得到一个SIGBUS 例如 如果我把一个my_-packed_结构放在地址0x2000,那么我也会把另一个_结构放在0x200B(+11字节) 因此,如果我想访问另一个结构,例如(other_struct*)0x200B,我会得到一个SIGBUS 所以我很好奇,是否有办法让G

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

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

例如

如果我把一个my_-packed_结构放在地址0x2000,那么我也会把另一个_结构放在0x200B(+11字节)

因此,如果我想访问另一个结构,例如(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匹配,但我正在寻找一种不必手动计算大小和填充的解决方案(例如,如果将来必须添加另一个属性)

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

这个技巧怎么样

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

为什么它会起作用

  • 活接头已打包,因此不会额外填充
  • pad将始终是4的倍数(因为int)
  • sizeof calculation将确保它足够大,可以容纳整个my\u packed\u结构

  • 。。。对于空间优化,
    首先:不要使用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;