迭代器::d ifference_types 系统独立

Are iterator::difference_types system independent

本文关键字:系统 独立 types ifference 迭代器      更新时间:2023-10-16

我有一些序列化逻辑,其中我也序列化stl数据结构。目前,我只是编写大小字段,然后通过迭代来编写结构的每个元素。在反序列化中,我读取了 size 字段,然后我知道何时读取完数据结构。

不,问题是如何正确编写大小字段并且独立于系统。目前我正在使用std::iterator_traits<const_iterator>::difference_type作为存储在文件中的类型。但是,当我尝试在不同系统之间交换文件时,我不确定这种类型是否保证与系统无关,或者它是否会发生变化。

我看了一下这个类型std::string在这种情况下,sizeof(std::iterator_traits<std::string::const_iterator>::difference_type)在 64 位机器上返回 8。所以我想在这种情况下,这只是一个占用一个单词的 typedef size_t。我目前这里没有可用的 32 位机器,所以我无法检查那里的大小是否不同。

标准是否保证这是可移植的,或者我应该在这里对所有数据结构使用一些固定类型来编码长度?

所有这些 typedefs 的全部意义在于您不需要全局修复该类型!

对于序列化,您必须决定并修复序列化格式。此时,您可以简单地要求大小适合 32 位整数,测试给定大小是否适合并转换。如果出现错误,您可以让序列化失败(例如"数据结构不可序列化"(。如果您认为有必要,请将大小字段设为 64 位,您应该有足够的回旋余地,但由您来权衡空间与灵活性和使用配置文件。您真的会拥有包含超过 40 亿个元素的容器并将其写入磁盘吗?

序列化是关于做出决策和发布处方,您必须忍受并考虑导入和导出失败的可能性。

标准是否保证这是可移植的,或者我应该在这里对所有数据结构使用一些固定类型来编码长度?

不,它不是便携式的,是的,您应该使用一些固定大小的类型。 对于大多数应用程序,32 位整数应该没问题。 请注意,根据您的序列化代码和可移植性要求,您还可能遇到字节顺序问题(小端序与大端序(。

有关更多信息和最佳实践,请查看Qt QDataStream的文档。 Qt人建议决定一个固定大小的整数类型(比如qint32(,然后在序列化时适当地转换。

difference_type

标准定义为"有符号积分类型"(20.1.5,表32(,并且必须是类型ptrdiff_t(20.1.5/4(的typedef,而又是实现定义的(5.7/6(。

由于这里的共同点是它可以转换为"有符号整型",如果您需要序列化此值,我建议static_cast将其转换为类似long并将其保存。