【发布时间】:2012-09-01 14:38:41
【问题描述】:
除非使用打包编译器选项或 pragma,否则代码如下(假设 8 位 char 和 16 位 short)
struct foo
{
short a ;
char b ;
short c ;
} ;
据我所知,在我们的产品支持的所有平台(不少)上,c 之前的 1 个字节的对齐焊盘最终会结束。
我不记得有任何平台没有在b 和c 之间放置对齐填充,但想象一下编译器可以合法地将填充放在a 和b 之间。
(动机:我们在代码中引入了一些基础设施,以确保当前写入磁盘或涉及网络流的某些结构的二进制兼容性,并且在可能的情况下,希望插入显式填充以便其他开发人员知道这些数据结构在幕后消耗的额外存储空间)。
是否有人知道一个平台,其编译器不会在需要时将对齐填充放在紧邻否则将不对齐的成员之前?
【问题讨论】:
-
有趣的问题。我很好奇你为什么以这种方式问你关于这个 C 危险区的问题,你愿意分享你的动机吗?
-
如果某些平台将
shorts 和chars 对齐到4 个字节怎么办?在未来的平台上可能有充分的理由,例如:gcc.gnu.org/wiki/Atomic/GCCMM/DataRaces -
我强烈推荐阅读Write Portable Code。使用结构序列化数据不是一个好主意。包装和字节序每次都会让你受益。
-
谢谢,我会把那本书放在我的阅读清单中。但是请注意,我们的产品(IBM 的 DB2 服务器)非常庞大,并且在这样的代码库中有很多动力和惯性。在不久的将来,不使用结构来序列化数据不是一种选择。