C++ 在为视频游戏实现基本二进制序列化时,可移植性是否值得担心?
我正在编写一个简单的二进制序列化程序,为针对Windows、Mac和Linux 64位平台的64位视频游戏生成保存文件。为序列化选择的变量类型有:char、short、bool、unsigned int、int、float、double和long int。我正在Visual Studio上编译。序列化尽可能简单,不需要检查,只需简单地写入二进制数据,然后按相同顺序反序列化数据。在整个游戏过程中,游戏会频繁地将新数据保存到文件中,但数据仅在游戏开始前反序列化一次 我不认为便携性是我需要担心的一个简单的保存游戏功能;然而,我一直在阅读与二进制序列化相关的许多可移植性问题(例如,浮点表示、int的位宽度变化、endianness、对齐等)我对我对这个主题的理解没有足够的信心来确定这些可移植性问题不会在这个项目中出现。也许有人愿意就以下假设分享一些观点:C++ 在为视频游戏实现基本二进制序列化时,可移植性是否值得担心?,c++,linux,windows,serialization,C++,Linux,Windows,Serialization,我正在编写一个简单的二进制序列化程序,为针对Windows、Mac和Linux 64位平台的64位视频游戏生成保存文件。为序列化选择的变量类型有:char、short、bool、unsigned int、int、float、double和long int。我正在Visual Studio上编译。序列化尽可能简单,不需要检查,只需简单地写入二进制数据,然后按相同顺序反序列化数据。在整个游戏过程中,游戏会频繁地将新数据保存到文件中,但数据仅在游戏开始前反序列化一次 我不认为便携性是我需要担心的一个简
非常感谢。如果您使用大小整数类型,如
::std::uint32\u t
而不是模糊类型,如unsigned long
,那么您将可以避免在32位/64位平台和不同编译器之间可能出现的整数大小变化。整型比特宽度在技术上可能会有所不同,但只适用于那些显然不适合玩游戏的非常奇特的平台。浮点大小和表示形式也不应该引起关注
为了确保读/写数据结构的大小和对齐在不同平台上保持一致,您应该在代码中使用static\u assert
但是,如果希望保存的文件可移植,则必须检查endianness。通常,您可能希望使用本机endianness序列化数据,并在文件开头写入一些表示其endianness的幻数(如
0x01020304
)。然后,当您反序列化时,首先检查此魔术,然后选择本机endianness反序列化程序(速度更快)或翻转endianness反序列化程序(速度较慢)。如果您仅计划支持x86 Endians,则不必担心。整数大小的可变性可以通过cstdint
中定义的固定宽度整数来解决。非常感谢,这接近我的计划。在反序列化过程中转换endian类型就像反转字节顺序一样简单;i、 我不需要担心重新排序单个位?是的,重新排序位是不必要的。