C语言 关于结构打包,我还需要担心哪些其他编译器?



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

你问题的前提是错误的。打包结构不是你"应该使用"来节省空间的东西。它们是一个可疑的非标准功能,有很多问题应该尽可能避免。(最终总是可以避免它们,但有些人对所涉及的权衡犹豫不决。例如,无论何时使用打包结构,任何指向成员的指针的使用都可能是不安全的,因为指针值不一定是指向它所指向类型的有效(正确对齐(指针。唯一需要打包结构的情况是当您使用它们来访问未对齐的内存映射硬件寄存器或访问未对齐的文件/磁盘上数据结构时(但后者无论如何都不会是可移植的,因为表示/字节序可能不匹配,并且这两个问题都可以通过适当的序列化/反序列化功能更好地解决(。

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

最新更新