【发布时间】: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