除非包装编译选项或编译指示被使用,像下面(假设8位炭和16位短)平台特定放置
struct foo
{
short a ;
char b ;
short c ;
} ;
代码将结束与,以据我所知,在我们的产品支持的所有平台(相当一部分)上的c
之前有一个字节的对齐板。
我不记得看到的是没有把b
和c
之间的对齐填充任何平台,但试想,一个编译器可能只是在法律上把a
和b
之间的填充。 (动机:我们在代码中引入了一些基础结构,以确保当前写入磁盘或涉及网络流的某些结构的二进制兼容性,并且在可能的情况下希望插入明确的填充以便其他开发人员意识到这些数据结构在封面下消耗的额外存储空间)。
有没有人知道一个平台谁是编译器没有把对齐填充,如果需要,立即之前将成为未对齐的成员?
有趣的问题。我很好奇你为什么以这种方式问你关于这个C危险区域的问题,你愿意分享你的动机吗? –
如果某个平台将“short”和“char”对齐到4个字节会怎样?在未来的平台上可能有很好的理由,例如:http://gcc.gnu.org/wiki/Atomic/GCCMM/DataRaces – ninjalj
我强烈推荐阅读[编写可移植代码](http://www.hookatooka的.com/WPC /)。使用结构来序列化数据不是一个好主意。包装和endianess会让你每一次。 – jszakmeister