STL向量中隐藏的副本?

use*_*171 1 c++ memory-management copy vector

使用带类的向量时,我遇到意外的性能下降.

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

    csv_File file("file.csv");
    file.access(2,2);
Run Code Online (Sandbox Code Playgroud)

访问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); 
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

    //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);
Run Code Online (Sandbox Code Playgroud)

附加详细信息(如有必要):此代码的应用是将一堆csv文件加载到内存中,然后将其传递给将对数据进行一些计算的朋友类.原理上,我有以下内容:

1)csv_Array具有私有成员向量存储; 2)csv_Analysis是一个csv_Array的朋友的类3)csv_Analysis访问矢量存储,它位于csv_Array中4)这种访问是通过将csv_Analysis传递给csv_Array中的存储(因此没有希望复制....)来完成的,例如public: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); 
Run Code Online (Sandbox Code Playgroud)

其中grab以相同的方式起作用,并且也被定义为csv_Analysis类的成员函数.

Eri*_*ahm 5

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

csv_File& grab(int index);
Run Code Online (Sandbox Code Playgroud)