除非使用打包编译器选项或编译指示,否则代码如下(假设8位字符和16位短字节)
struct foo
{
short a ;
char b ;
short c ;
} ;
据我所知,在我们产品支持的所有平台(很多)上c
之前,将最终得到一个1字节的对齐板。
我不记得看到任何没有在b
和c
之间放置对齐填充的平台,但是想象编译器可以合法地将填充放在a
之间和b
。
(动机:我们在代码中引入了一些基础设施,以确保当前写入磁盘或涉及网络流的某些结构的二进制兼容性,并且在可能的情况下,希望插入显式填充以便其他开发人员知道这些数据结构掩盖了额外存储的消耗。)
有人知道某个平台的编译器在需要时不会在未对齐的成员之前放置对齐填充吗?
答案 0 :(得分:3)
它并不是我所知道的任何地方的默认值,但MSVC(我相信,为了兼容性)支持#pragma pack
,它允许控制结构打包并允许错位访问。
基本上,对C结构的字节布局的任何假设只是要求麻烦。执行此操作的代码也会陷入对单词字节序进行假设的陷阱,这种情况绝对在公共平台之间不兼容。