iterator :: difference_types是否与系统无关

时间:2011-10-25 13:16:58

标签: c++ stl iterator

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

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

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

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

3 个答案:

答案 0 :(得分:3)

所有这些typedef的重点在于你需要全局修复类型!

对于序列化,您必须决定并修复序列化格式。此时,您可以简单地要求大小适合32位整数,测试给定大小是否和转换。如果出现错误,您可以让序列化失败(例如“数据结构不可序列化”)。如果您认为有必要,请将尺寸字段设置为64位,并且您应该有足够的余地,但是您可以根据灵活性和使用情况来衡量空间。你真的拥有超过40亿个元素的容器并将它们写入磁盘吗?

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

答案 1 :(得分:2)

  

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

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

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

答案 2 :(得分:2)

difference_type被标准定义为“有符号整数类型”(20.1.5,表32),并且必须是typedef类型ptrdiff_t(20.1。 5/4),反过来,是实现定义的(5.7 / 6)。

由于这里的共同点是它可以转换为“有符号整数类型”,如果你需要序列化这个值,我建议static_cast将它变成像long这样的东西。保存。