C 在OS X上使用-m32进行联合编译的冗余大小

C 在OS X上使用-m32进行联合编译的冗余大小,c,gcc,clang,unions,memory-alignment,C,Gcc,Clang,Unions,Memory Alignment,我的代码中有以下标记的联合: 当我在64位Linux或OS X上使用gcc或clang编译它时,cell\u t的大小总是32字节(4*sizeof(long),如预期的那样) 当我在Linux(Ubuntu14.04,GCC4.8)上使用-m32开关编译它时,大小是16字节(如预期的那样) 当我在OSX(10.9.5)上使用gcc(4.8)或clang(Apple 6.0)和-m32编译相同的代码时,大小是20字节。我试着调试程序,看看是否有可能使用第五个单词的联合案例,但没有找到任何。它不依

我的代码中有以下标记的联合:

当我在64位Linux或OS X上使用gcc或clang编译它时,
cell\u t
的大小总是32字节(
4*sizeof(long)
,如预期的那样)

当我在Linux(Ubuntu14.04,GCC4.8)上使用
-m32
开关编译它时,大小是16字节(如预期的那样)

当我在OSX(10.9.5)上使用gcc(4.8)或clang(Apple 6.0)和
-m32
编译相同的代码时,大小是20字节。我试着调试程序,看看是否有可能使用第五个单词的联合案例,但没有找到任何。它不依赖于优化级别和调试信息的存在

你知道为什么OSX上的
sizeof(cell\u t)
是20字节吗?

sizeof(off_t) == 8
在Linux上:

sizeof(off_t) == 4

在字符串中使用该类型。可能还有其他情况,但这是我第一次遇到。

编译器是如何布置结构的?@DavidHeffernan:它对
类型使用第一个字节,对
nref
使用三个字节,union按预期使用12个字节。最后4个字节是零(根据我所看到的,如果我没有遗漏任何内容的话)。你的意思是填充,而不是我猜的零。谢谢。将其更改为
ptrdiff\u t
off\u t
实际上用于文件。