【问题标题】:File I/O for a vector of arrays数组向量的文件 I/O
【发布时间】:2018-02-03 19:19:43
【问题描述】:

这个问题对如何将std::vector 写入文件有很好的答案:Reading and writing a std::vector into a file correctly

就我而言,我有一个数组向量:

vector<array<double, 3> > vec;

我想写入一个文件以获得具有以下格式的文件,其中值是双精度数,第一个数字是向量中的位置,第二个是数组中的位置:

vec0_0 vec0_1 vec0_2 vec1_0 vec1_1 vec1_2 vec2_0 ...

我可以使用...

std::copy(vec.begin(), vec.end(), std::ostreambuf_iterator<char>(FILE));

...或...

size_t sz = vec.size();
FILE.write(reinterpret_cast<const char*>(&vec[0]), sz * sizeof(vec[0]));

...正如在提到的问题中针对标量类型提出的那样,还是因为vector 中的类型是array 而我需要做不同的事情?

【问题讨论】:

  • 你是什么意思安全
  • @user0042:现在更快乐了吗? ;-)
  • 你为什么不试试呢?应该工作......
  • @user0042:vector 保证它的元素像经典的 C 数组一样存储。但是否也保证array&lt;double, 3&gt; 在内存中准确且不超过 3 个连续双打? (顺便说一句,你的答案包含“尝试”和“应该”。所以你明白我最初要求“安全”的原因了吗?)

标签: c++ arrays vector


【解决方案1】:

据我了解,std::array 具有连续存储。但是,我认为这不能保证没有填充。如果这只是一个 double[3],它会开箱即用,但我认为你必须非常仔细地测试并担心容器内 std::array 的可移植性。

事实上,环顾四周,已经有一个垫子系统的例子。

std::array alignment

sizeof(int) = 4;  
sizeof( std::tr1::array< int,3 > ) = 16;  
sizeof( std::tr1::array< int,4 > ) = 16;    
sizeof( std::tr1::array< int,5 > ) = 32;

大概这个填充是实现定义的,或者你可以在某个地方的标准中找到它。无论如何,我只是迭代这个东西或使用一个非 stl 数组。

我猜这个概念类似于struct,其中经常引入填充以优化内存访问,但是编译器正在优化该填充,并且可以在大多数编译器上使用#pragma pack 语句将其关闭。据我所知,stl 容器并非如此。

【讨论】:

  • 如果使用反向代码从该文件中取回值,填充是否真的很重要? (让我们假设相同的目标平台和编译器)
  • @user0042:不,在这种情况下,填充或任何其他数据都无关紧要。但我要求在问题中提供特定的结果文件布局。
  • 是的,我的意思是,最重要的是,除非您的分析器告诉您这是您的应用程序的瓶颈,否则您可能不需要一次编写所有内容。如果它以某种方式成为热点并且老板在你的脖子上呼吸,我会在内部重构并使用非 stl 类型。无害无犯。否则有利于可读性和可维护性,这样下一个走上这条路的人就不必弄清楚发生了什么神奇的填充废话。
猜你喜欢
  • 2012-11-05
  • 2012-07-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-10
  • 2012-05-01
相关资源
最近更新 更多