【问题标题】:hidden copy in STL vector?STL向量中的隐藏副本?
【发布时间】:2011-09-24 18:14:02
【问题描述】:

在将向量与类一起使用时,我遇到了意外的性能下降。

我有一个 csv_File 类,它读取 csv 文件并将内容存储在 2D 向量中。有一个允许访问的成员函数,例如

    csv_File file("file.csv");
    file.access(2,2);

访问 2,2 元素。

然后,我有另一个类 csv_Array,它将多个 csv_File 对象存储在一个向量中,例如私有成员向量 有一个允许访问的成员函数,即它返回一个 csv_File 对象,例如:

    csv_Array file_array(5); //store 5 csv_File objects
    file_array.grab(0).access(2,2); 

在第二行中,grab 返回一个 csv_File 对象(在本例中为第一个),access 是 csv_File 对象的成员函数。

但是,我注意到调用 csv_Array.grab(0).access(2,2); 比它应该的要慢得多(它应该只是 3 个 vector::at 调用)。

是否有某种隐藏的副本正在使这变得非常缓慢?

编辑:以下是一些相关的函数原型:

    //Access in csv_File
    std::string access(int row, int column);

    //grab in csv_Array and csv_Analysis (mentioned below)
    csv_File grab(int index);

其他详细信息(如有必要): 这段代码的应用是将一堆 csv 文件加载到内存中,然后将其传递给一个朋友类,该类将对数据进行一些计算。从示意图上看,我有以下内容:

1) csv_Array 有私有成员向量存储; 2) csv_Analysis 是一个类,它是 csv_Array 的朋友 3) csv_Analysis 访问向量存储,在 csv_Array 4)通过向 csv_Analysis 传递对 csv_Array 中存储的引用来完成此访问(因此希望没有副本......),例如 民众: csv_Analysis(csv_Array &csv_block);

因此,上面给出的调用[file_array.grab(0).access(2,2); ] 实际上在两者之间还有一个额外的类“级别”,更像是

    csv_Analysis analysis_Object(file_array); 
    analysis_Object.grab(0).access(2,2); 

其中grab的作用相同,也被定义为csv_Analysis类的成员函数。

【问题讨论】:

  • 你能发布你的抓取和访问功能的原型吗?
  • 我已经编辑了我的帖子以包含原型,我现在可以看到为什么这可能很重要。

标签: c++ memory-management vector copy


【解决方案1】:

如果你能准确地展示函数是如何声明的,尤其是返回值,那将会非常有帮助。我怀疑您返回的是副本而不是参考,但我还不能确定。

【讨论】:

  • 我现在已将信息添加到我的原始帖子中,感谢您的关注。
【解决方案2】:

你可能想让grab返回一个引用而不是一个副本:

csv_File& grab(int index);

【讨论】:

  • 是的,如果你不这样做,抓取将复制 csv_File 中的所有内容,包括你的向量。如果您来自 Java 或 C# 世界,则需要记住 C++ 大部分时间使用值,并且值与其内容一起复制。
  • 啊,是的,我相信这会修复错误。同样重要的是要注意返回的引用需要声明为 const 否则代码将无法编译。实际上,还有一些其他的编译问题,所以看起来做这个改变并不那么简单。
猜你喜欢
  • 1970-01-01
  • 2022-06-30
  • 2014-09-23
  • 2022-01-20
  • 1970-01-01
  • 1970-01-01
  • 2021-11-27
  • 2013-12-01
  • 1970-01-01
相关资源
最近更新 更多