跳至主要內容
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?

4563博客

全新的繁體中文 WordPress 網站
  • 首頁
  • 请问编译器对 C 结构体成员自然对齐是一个惯例,还是说有相关标准规定呢?
未分類
6 2 月 2021

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

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

資深大佬 : wheeler 6

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

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

V 友怎么看呢?

大佬有話說 (10)

  • 資深大佬 : XiaoxiaoPu

    编译器会自动对齐,会浪费一点内存。

  • 資深大佬 : ly841000

    平常用的 c 编译器都会自动对齐啊? 你用的是什么?

  • 主 資深大佬 : wheeler

    @ly841000 是啊。gcc 。

  • 資深大佬 : linux40

    会对齐,但不是 4 字节对齐,而是根据一套规则对齐。不打算上代码的话,自己去查 cppreference 。

  • 資深大佬 : QBugHunter

    @wheeler
    GCC 我记得有个选择,默认不开启,开启了回自动对齐

  • 資深大佬 : favourstreet

    是 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

    额 网络通信需要考虑

  • 資深大佬 : jones2000

    如果对外的结构体,我都强制 1 字节对齐。 内部用无所谓了。

  • 資深大佬 : dorentus

    会自动补。

    平时不需要字节序列化的顶多是根据目标编译器和平台的规则,可以自己调整调整字段顺序来减少补的大小

  • 資深大佬 : rainman777

    我之前遇到过这个问题,因为没对齐导致段错误。后来用的#pragma pack (n)
    当时用的 ESP8266 linux 环境下编译的一个开源红外库代码。

文章導覽

上一篇文章
下一篇文章

AD

其他操作

  • 登入
  • 訂閱網站內容的資訊提供
  • 訂閱留言的資訊提供
  • WordPress.org 台灣繁體中文

51la

4563博客

全新的繁體中文 WordPress 網站
返回頂端
本站採用 WordPress 建置 | 佈景主題採用 GretaThemes 所設計的 Memory
4563博客
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?
在這裡新增小工具