首页 > 解决方案 > 我还需要担心哪些其他编译器来担心结构打包?

问题描述

在 GCC 中,我需要使用__attribute__((packed))使结构占用最少的空间,例如,如果我有大量结构,我应该打包它们。还有哪些常见的编译器会进行结构填充,以及如何在这些其他编译器中打包结构?

标签: ccompiler-specific

解决方案


你问题的前提是错误的。打包结构不是您“应该使用”来节省空间的东西。它们是一个可疑的非标准功能,有很多问题应该尽可能避免。(最终总是有可能避免它们,但有些人对所涉及的权衡取舍犹豫不决。)例如,每当您使用压缩结构时,任何指向成员的指针的使用都可能不安全,因为指针值不一定是有效的(正确对齐)指向它指向的类型的指针。唯一“需要”打包结构的情况是,当您使用它们访问未对齐的内存映射硬件寄存器或访问未对齐的文件内/磁盘数据结构时(但后者赢了'无论如何都不可移植,因为表示/字节顺序可能不匹配,

如果您的目标是节省空间,那么只要您控制结构的定义,只需对其进行排序,以免留下不必要的填充空间。这可以简单地通过按大小递减的顺序排列成员来实现;如果你这样做,那么在任何合理的实现中,浪费的空间最多将是最大成员的大小和最小成员的大小之间的差异。


推荐阅读