c - 我还需要担心哪些其他编译器来担心结构打包?
问题描述
在 GCC 中,我需要使用__attribute__((packed))
使结构占用最少的空间,例如,如果我有大量结构,我应该打包它们。还有哪些常见的编译器会进行结构填充,以及如何在这些其他编译器中打包结构?
解决方案
你问题的前提是错误的。打包结构不是您“应该使用”来节省空间的东西。它们是一个可疑的非标准功能,有很多问题应该尽可能避免。(最终总是有可能避免它们,但有些人对所涉及的权衡取舍犹豫不决。)例如,每当您使用压缩结构时,任何指向成员的指针的使用都可能不安全,因为指针值不一定是有效的(正确对齐)指向它指向的类型的指针。唯一“需要”打包结构的情况是,当您使用它们访问未对齐的内存映射硬件寄存器或访问未对齐的文件内/磁盘数据结构时(但后者赢了'无论如何都不可移植,因为表示/字节顺序可能不匹配,
如果您的目标是节省空间,那么只要您控制结构的定义,只需对其进行排序,以免留下不必要的填充空间。这可以简单地通过按大小递减的顺序排列成员来实现;如果你这样做,那么在任何合理的实现中,浪费的空间最多将是最大成员的大小和最小成员的大小之间的差异。
推荐阅读
- php - Laravel 5.5:安装 PHP 7.1.19 时找不到“整理器”
- jhipster - JHipster:通过 Okta 进行 Facebook 社交登录后的空白页面
- batch-file - 使用批处理脚本在文本文件中搜索和替换文本
- c++ - c++ libcurl - 使用前一个 curl 的响应作为另一个 curl 的参数
- php - PHP preg_match_all(): 未知修饰符 '>'
- shell - How to extract a entire row, based on a single key word with first occurrence from a csv or excel file?
- typescript - TypeScript instanceof guard fails
- android-studio - Is there a way to ignore code style setting in Android Studio
- .net - 单元测试:检查私有静态 void 方法中局部变量的值
- python - Change json formatting for pandas to_json(orient="records") method