STL矢量中的隐藏副本

hidden copy in STL vector?

本文关键字:隐藏 副本 STL      更新时间:2023-10-16

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

我有一个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_Fileobject的成员函数。

然而,我注意到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类的成员函数。

您可能希望使grab返回引用而不是副本:

csv_File& grab(int index);

如果您能准确地展示函数的声明方式,尤其是返回值,那将非常有帮助。我怀疑你退回的是一份复印件而不是推荐信,但我还不能确定。