对于这种类型的二进制IO操作,持久性会是一个问题吗
Will Endianness be an issue for this type of binary IO operation?
为了节省空间,我决定使用二进制代码对保存文件进行编码。每个字节表示磁贴类型的id。这会导致不同的Endian计算出现问题吗?
此外,出于好奇,是CPU还是操作系统设置了Endian类型?
附加信息:我正在使用C++并构建一个x平台游戏。我不想使用额外的API,如Boost。
是的,如果从BE保存的文件加载到LE上,或者反之亦然,这将导致问题。这就是为什么一些Unicode编码(如UTF-16和UTF-32)具有所谓的字节顺序标记的原因。
如果你的代码通常是在BE上编译的,那么在使用数据之前,你仍然必须确保LE代码会交换字节顺序。
CPU设置Endianess,并且一些芯片(例如,一些MIPS CPU)允许在引导系统时切换Endianess。
我们可以使用更多的信息。跨平台是一回事,但什么平台呢?如果你指的是像x86 Mac、x86 Linux和x86 Windows这样的跨平台,那么不,你不需要担心它(尽管如果你试图将结构转发到磁盘并在不同平台上使用不同的编译器进行编译,结构打包可能仍然是一个问题)。即使你有几个不同的OS/CPU组合,你也可以列出你想要支持的一切,如果它们都有相同的endianes,也不用担心。
如果你不期望保存数据会从一个平台移动到另一个平台,你也不必担心。只有当你想在大端机器上创建数据,然后在小端机器上读取数据时,端性才是一个问题,反之亦然。如果这些只是本地数据文件,那没什么大不了的,尽管可以放心地假设,如果你的用户可以将他们的保存从一个平台复制到另一个平台,他们会的,因为他们几乎会做任何你不想让他们做也不支持的事情。
此外,由于您只提到了字节,如果字节数组和数据一样复杂,那么实际上不需要担心字节序。这只是多字节数据类型的问题。因此,如果您只是保存字节数组,而其他记账数据也适用于字节,则无需担心,但一旦保存short、int或float,就会出现潜在的endian问题。
我个人的观点是,无论何时序列化,都要考虑到endianes,但我有一个非常多平台的背景(即在5个游戏系统上运送相同的产品)。这很容易,交换宏已经存在,当你不可避免地决定转移到另一个endianes时,你不必重写东西。如果数据更复杂或更结构化,可以考虑像Protocol Buffers或BSON这样的库。
CPU和操作系统都可能负责端序。从历史上看,它是被烘焙到CPU中的,尽管x86仍然是硬连接的小端,但大多数现代RISC衍生物可以在任何一种模式下运行,这使它成为硬件和操作系统开发人员的选择。
- 一个关于在C++中重载布尔运算符的问题
- 发送一个带有libcurl C++问题的帖子请求:s
- 在决定是通过参考还是通过价值时,尺寸真的是一个问题吗
- 在用于格式4的arm模拟器中实现功能时的一个问题
- 我试图制作一个程序,要求用户输入问题和答案,但程序循环不正确
- 使用运算符 [] 引用 std::vector 上最后一个元素时出现问题<>
- 为我的 c++ 类介绍制作一个三角形分类器.我有几个问题
- 关于复制构造函数的一个棘手问题
- Tmax(0x7fffffff 的一个奇怪问题,为什么 (!x) == x?
- C++线程安全:如果只有一个线程可以写入非原子变量,但多个线程从中读取. 会遇到问题吗?
- 我正在尝试解决一个需要数组总和值但代码不起作用的问题,我想做这样的事情
- 在解决链表问题时创建一个额外的节点是一个好习惯吗?
- 存储另一个函数返回的布尔数组时遇到问题
- 为什么在分配给成员变量之前获取unique_ptr的返回是一个问题?
- 我在使用 boost::serialization 时遇到了一个问题,我的代码在 Linux 中运行良好,但在 Wind
- 我有一个关于C++提升的问题:: asio 和 std :: 异步
- 这是一个二叉搜索树吗?黑客排名问题
- 几对性能问题(一个较大的向量与较小的块向量),值得存储迭代索引以进行矢量访问
- GLSL问题:一个程序中有多个着色器
- 设计问题——一个函数调用所有三个函数