完全披露 - 这是家庭作业,虽然已经完成并且可以正常工作,但我正在寻找更好的解决方案。
我有一个二进制文件,它是由在 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))
类型的选项或任何其他更清洁的解决方案?
最佳答案
区别在于我们是默认 32 位对齐 double 还是默认 64 位对齐 double 。在 32 位机器上,在 64 位边界上加倍可能有一些好处,但可能并不大。 VC 在这方面可能比 gcc 更谨慎。
最重要的是,如果您使用结构进行序列化,您应该始终将它们打包(即 8 位对齐),然后手动进行对齐。这样,您的代码肯定会跨平台兼容。
关于c++ - 序列化二进制结构 gcc vs cl,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3557523/