序列化二进制struct gcc vs cl

时间:2010-08-24 14:30:09

标签: c++ visual-studio gcc binary struct

完全披露 - 这是家庭作业,虽然已经完成并且完全正常,但我正在寻找更好的解决方案。

我有一个二进制文件,它是由在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)) - 类型选项或任何其他更清洁的解决方案?

1 个答案:

答案 0 :(得分:1)

差异源于默认情况下我们是32位对齐双精度还是64位对齐双精度。在32位机器上,在64位边界上具有双倍可能有一些好处,但可能不是很大。然后VC可能比gcc更加小心。

如果您使用结构进行序列化,则应始终将它们打包(即8位对齐),然后手动进行对齐。这样,您的代码肯定会跨平台兼容。