与GCC无内存对齐

Edw*_*win 4 c compiler-construction gcc memory-alignment compiler-optimization

我正在处理一些分组数据.我创建了用于保存数据包数据的结构.这些结构是由python为特定的网络协议生成的.

问题在于,由于编译器对齐结构这一事实,当我通过网络协议发送数据时,消息最终会比我想要的更长.这会导致其他设备无法识别该命令.

有没有人知道可以解决这个问题,这样我的打包器的大小应该是结构的大小,还是有办法可以关闭内存对齐?

Car*_*rum 6

在GCC中,您可以使用__attribute__((packed)).这些天GCC也支持#pragma pack.

  1. attribute 文件
  2. #pragma pack 文件

例子:

  1. attribute 方法:

    #include <stdio.h>
    
    struct packed
    {
        char a;
        int b;
    } __attribute__((packed));
    
    struct not_packed
    {
        char a;
        int b;
    };
    
    int main(void)
    {
        printf("Packed:     %zu\n", sizeof(struct packed));
        printf("Not Packed: %zu\n", sizeof(struct not_packed));
        return 0;
    }
    
    Run Code Online (Sandbox Code Playgroud)

    输出:

    $ make example && ./example
    cc     example.c   -o example
    Packed:     5
    Not Packed: 8
    
    Run Code Online (Sandbox Code Playgroud)
  2. pragma pack 方法:

    #include <stdio.h>
    
    #pragma pack(1)
    struct packed
    {
        char a;
        int b;
    };
    #pragma pack()
    
    struct not_packed
    {
        char a;
        int b;
    };
    
    int main(void)
    {
        printf("Packed:     %zu\n", sizeof(struct packed));
        printf("Not Packed: %zu\n", sizeof(struct not_packed));
        return 0;
    }
    
    Run Code Online (Sandbox Code Playgroud)

    输出:

    $ make example && ./example
    cc     example.c   -o example
    Packed:     5
    Not Packed: 8
    
    Run Code Online (Sandbox Code Playgroud)

  • IIRC,`#pragma pack`是与MS编译器兼容的黑客攻击,因此只能用于x86目标.如果你想要移植到其他目标(但不是VC++),你应该使用前者.如果你想要两者,你将不得不使用`#ifdef`s. (3认同)
  • @roderigo #pragma pack适用于gcc中的所有体系结构.在某些体系结构上有一个#pragma ms_struct用于微软兼容性 (3认同)
  • 但请参阅[此问题](http://stackoverflow.com/q/8568432/827263); 如果你不小心,`#pragma pack`会导致不安全的代码. (2认同)