STL向量中隐藏的副本?

时间:2011-06-29 00:08:32

标签: c++ memory-management vector copy

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

我有一个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)。访问(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);

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

1)csv_Array有私有成员矢量存储; 2)csv_Analysis是一个csv_Array的朋友 3)csv_Analysis访问矢量存储,它位于csv_Array中 4)通过在csv_Array中传递csv_Analysis对存储的引用来完成此访问(所以没有希望复制....),例如  上市:   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类的成员函数。

2 个答案:

答案 0 :(得分:5)

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

csv_File& grab(int index);

答案 1 :(得分:0)

如果您精确地显示函数的声明方式,尤其是返回值,那将非常有用。我怀疑你要归还副本而不是参考,但我还不知道。