V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
wheeler
V2EX  ›  问与答

请问编译器对 C 结构体成员自然对齐是一个惯例,还是说有相关标准规定呢?

  •  
  •   wheeler · 2021-01-22 13:11:48 +08:00 · 1508 次点击
    这是一个创建于 1386 天前的主题,其中的信息可能已经有所发展或是发生改变。

    今天代码 review 的时候一位同事说“你的结构体代码没有 4 字节补齐”。

    我以为编译器都会进行补齐,在对结构体成员布局不敏感的情况下,不需要手动补齐。如果真的内存布局敏感的场景,比如网络,进程间消息,应该用#pragma pack 之内的吧。

    V 友怎么看呢?

    10 条回复    2021-01-22 23:41:16 +08:00
    XiaoxiaoPu
        1
    XiaoxiaoPu  
       2021-01-22 13:32:01 +08:00
    编译器会自动对齐,会浪费一点内存。
    ly841000
        2
    ly841000  
       2021-01-22 13:38:06 +08:00
    平常用的 c 编译器都会自动对齐啊? 你用的是什么?
    wheeler
        3
    wheeler  
    OP
       2021-01-22 13:40:17 +08:00 via iPhone
    @ly841000 是啊。gcc 。
    linux40
        4
    linux40  
       2021-01-22 14:00:05 +08:00 via Android
    会对齐,但不是 4 字节对齐,而是根据一套规则对齐。不打算上代码的话,自己去查 cppreference 。
    QBugHunter
        5
    QBugHunter  
       2021-01-22 14:46:35 +08:00
    @wheeler
    GCC 我记得有个选择,默认不开启,开启了回自动对齐
    favourstreet
        6
    favourstreet  
       2021-01-22 15:11:10 +08:00   ❤️ 1
    是 Implementation-defined 。C17 标准 6.7.2.1“结构和联合体说明符”第 14 段:Each non-bit-field member of a structure or union object is aligned in an implementation-defined manner appropriate to its type.
    意思就是编译器自己决定。
    qian19876025
        7
    qian19876025  
       2021-01-22 16:47:07 +08:00
    额 网络通信需要考虑
    jones2000
        8
    jones2000  
       2021-01-22 20:06:11 +08:00
    如果对外的结构体,我都强制 1 字节对齐。 内部用无所谓了。
    dorentus
        9
    dorentus  
       2021-01-22 23:33:44 +08:00 via iPhone   ❤️ 1
    会自动补。

    平时不需要字节序列化的顶多是根据目标编译器和平台的规则,可以自己调整调整字段顺序来减少补的大小😏
    rainman777
        10
    rainman777  
       2021-01-22 23:41:16 +08:00   ❤️ 1
    我之前遇到过这个问题,因为没对齐导致段错误。后来用的#pragma pack (n)
    当时用的 ESP8266 linux 环境下编译的一个开源红外库代码。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5376 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 08:48 · PVG 16:48 · LAX 00:48 · JFK 03:48
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.