c++ - 序列化二进制结构 gcc vs cl

标签 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)) 类型的选项或任何其他更清洁的解决方案?

最佳答案

区别在于我们是默认 32 位对齐 double 还是默认 64 位对齐 double 。在 32 位机器上,在 64 位边界上加倍可能有一些好处,但可能并不大。 VC 在这方面可能比 gcc 更谨慎。

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

关于c++ - 序列化二进制结构 gcc vs cl,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3557523/

相关文章:

c++ - 在 C++ 中使用 goto 的正当理由

visual-studio - 我应该将 Visual Studio Debugger 附加到哪个进程来调试 Kestrel 应用程序?

使用FFMPEG库时编译错误

linux - Linux下的gcc可执行文件在哪里?

gcc - 设置 C 标准标志启用 GNU 扩展

c++ - 使用比较器排序时的未定义行为

c++ - 使用 std::async 调用模板化成员函数

c++ - 继承实际上会导致类的成员为 'inherited' 吗?

c# - Windows 窗体应用程序和 Windows 窗体应用程序 (.NET Framework) 之间有什么区别

git - 无法将本地 Git 存储库推送到 Visual Studio Online 项目