完全披露 - 这是家庭作业,虽然已经完成并且完全正常,但我正在寻找更好的解决方案。
我有一个二进制文件,它是由在Visual Studio中编译的程序创建的(我相信)。结构看起来像这样。
struct Record { char c; double d; time_t t; };
使用Visual Studio 2008在Windows上使用此结构的大小为24个字节。 1 + 8 + 8 = 24
。所以有一些填充正在进行中。 Linux和gcc上的相同结构提供16个字节。 1 + 8 + 4 = 16
。为了排除这一点,我添加了一些填充并将time_t
更改为另一种类型。那么我的结构就像这样。
struct Record { char c; char __padding[7]; double d; long long t; };
现在可以正常工作,gcc的大小为24字节,但看起来有点脏。所以有两个问题..
为什么两个编译器之间的实现方式不同?
是否有__attribute__ ((aligned))
- 类型选项或任何其他更清洁的解决方案?
答案 0 :(得分:1)
差异源于默认情况下我们是32位对齐双精度还是64位对齐双精度。在32位机器上,在64位边界上具有双倍可能有一些好处,但可能不是很大。然后VC可能比gcc更加小心。
如果您使用结构进行序列化,则应始终将它们打包(即8位对齐),然后手动进行对齐。这样,您的代码肯定会跨平台兼容。