3

除非使用打包编译器选项或编译指示,否则代码如下(假设 8 位 char 和 16 位短)

struct foo
{
   short a ;
   char  b ;
   short c ;
} ;

据我所知,在c我们的产品支持的所有平台(不少)上,最后都会有一个 1 字节的对齐垫。

我不记得看到没有在band之间放置对齐填充的任何平台c,但可以想象编译器可以合法地将填充放在aand之间b

(动机:我们在我们的代码中引入了一些基础设施,以确保当前写入磁盘或涉及网络流的某些结构的二进制兼容性,并且在可能的情况下,希望插入显式填充,以便其他开发人员知道额外的这些数据结构在幕后消耗的存储空间)。

有谁知道一个平台,其编译器不会在需要时将对齐填充放在将不对齐的成员之前?

4

1 回答 1

3

它不是我所知道的任何地方的默认设置,但支持 MSVC(我相信,为了兼容性,还有 gcc),#pragma pack它允许控制结构打包并允许未对齐的访问。

基本上,任何对 C 结构字节布局的假设都是自找麻烦。这样做的代码也往往落入对单词字节序进行假设的陷阱,这在通用平台之间绝对不兼容。

于 2012-09-07T17:29:34.800 回答