序列化二进制结构 gcc vs cl

Posted

技术标签:

【中文标题】序列化二进制结构 gcc vs cl【英文标题】:Serializing binary struct gcc vs cl 【发布时间】:2010-08-24 14:30:08 【问题描述】:

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

我有一个二进制文件,它是由在 Visual Studio 中编译的程序创建的(我相信)。结构看起来像这样。

结构记录 字符 c; 双 d; time_t t; ;

在装有 Visual Studio 2008 的 Windows 上,此结构的大小为 24 个字节。 1 + 8 + 8 = 24。所以有一些填充正在进行。 Linux 和 gcc 上的相同结构提供 16 个字节。 1 + 8 + 4 = 16。为了对齐,我添加了一些填充并将time_t 更改为另一种类型。那么我的结构看起来像这样。

结构记录 字符 c; 字符 __padding[7]; 双 d; 长长t; ;

这现在可以工作了,gcc 将其大小设为 24 字节,但看起来有点脏。所以两个问题..

为什么这两个编译器的实现方式不同?

是否有任何__attribute__ ((aligned))-type 选项或任何其他更清洁的解决方案?

【问题讨论】:

你在 gcc 中使用了“-malign-double”吗?阅读:***.com/questions/2457182/… 【参考方案1】:

区别在于我们是默认 32 位对齐双精度还是默认 64 位对齐双精度。在 32 位机器上,在 64 位边界上有一个 double 可能有一些好处,但可能不是很大。那么 VC 可能会比 gcc 更小心。

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

【讨论】:

以上是关于序列化二进制结构 gcc vs cl的主要内容,如果未能解决你的问题,请参考以下文章

用c或c++实现结构体的序列化和反序列化

C# 中的 MFC 对象序列化

Java 序列化详解

序列化与反序列化

hessian原理解析三(序列化协议)

回顾一下Java中的序列化