迭代器::d ifference_types 系统独立
Are iterator::difference_types system independent
我有一些序列化逻辑,其中我也序列化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
并将其保存。
- C++,系统无法执行指定的程序
- 如何使用OpenCV将RBG图像转换为HSV,并将H、S和V值保存为C++中的3个独立图像
- 在UNIX系统中使用DIR查找文件的字节大小
- 错误处理.将系统错误代码映射到泛型
- 独立读取-修改-写入顺序
- 当系统的卷被修改时,如何修改WASAPI环回捕获卷
- 有什么好的方法可以让系统调用代理允许在单元测试中进行模拟
- 在C++游戏中与库存系统作斗争
- 文件系统:复制功能的速度秘诀是什么
- c++17文件系统::recursive_directory迭代器()在mac上没有给出这样的目录,但在windows上
- 在gtest.中使用fff.h模拟系统API
- 带有多个独立参数的C++For循环
- 如何制作无限制照明系统
- 系统.将数组移交给c#中动态加载的c++DLL时发生AccessViolationException
- 如何传递多个 std::文件系统选项?
- 遍历顺序由 std::文件系统directory_iterator给出
- 用于独立于系统的程序分发的即时C++编译器
- 面向嵌入式系统的独立于硬件C++ HAL
- 是否有办法实现多个独立的日志系统与Boost.Log
- 迭代器::d ifference_types 系统独立