序列化二进制结构 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
更改为另一种类型。那么我的结构看起来像这样。
这现在可以工作了,gcc 将其大小设为 24 字节,但看起来有点脏。所以两个问题..
为什么这两个编译器的实现方式不同?
是否有任何__attribute__ ((aligned))
-type 选项或任何其他更清洁的解决方案?
【问题讨论】:
你在 gcc 中使用了“-malign-double”吗?阅读:***.com/questions/2457182/… 【参考方案1】:区别在于我们是默认 32 位对齐双精度还是默认 64 位对齐双精度。在 32 位机器上,在 64 位边界上有一个 double 可能有一些好处,但可能不是很大。那么 VC 可能会比 gcc 更小心。
底线是,如果您使用结构进行序列化,您应该始终将它们打包(即 8 位对齐),然后手动进行对齐。这样你的代码就一定能跨平台兼容。
【讨论】:
以上是关于序列化二进制结构 gcc vs cl的主要内容,如果未能解决你的问题,请参考以下文章