使用带有类的向量时,我遇到意外的性能下降。
我有一个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类的成员函数。
答案 0 :(得分:5)
您可能希望grab
返回引用而不是副本:
csv_File& grab(int index);
答案 1 :(得分:0)
如果您精确地显示函数的声明方式,尤其是返回值,那将非常有用。我怀疑你要归还副本而不是参考,但我还不知道。