STL矢量中的隐藏副本
hidden copy in STL vector?
在类中使用向量时,我遇到了意外的性能下降。
我有一个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);
如果您能准确地展示函数的声明方式,尤其是返回值,那将非常有帮助。我怀疑你退回的是一份复印件而不是推荐信,但我还不能确定。
- 这是我尝试让用户将值输入到数组中.然后将其隐藏为大量的星号
- 用callgrind追踪不必要的副本
- 结构和双指针隐藏在其他结构中,多层混淆
- 关于:C++中异常对象的范围:为什么我没有得到副本?
- 在为LINUX创建共享库时,如何避免STL的私有/弱副本
- 检查注册表项是否链接到(或副本)另一个注册表项
- 在 cpp 文件中隐藏采用模板参数引用的方法
- 为什么构建目录中新构建的共享库与安装目录中的副本具有不同的依赖项集?
- C++基于范围的 for 循环和元素副本
- 参数包构造函数在类模板中隐藏用户定义的转换
- 如何等待窗口隐藏在Qt中?
- 如何使用类型别名从模板化类中隐藏模板列表
- 在设计 SDK 时,我是否应该在 C++ 头文件中完全隐藏内部类?
- 创建提升::shared_ptr的深层副本
- 如何从构造函数副本 T(const T&)调用对象 T?
- 副本初始化的默认模板参数推导
- C++深浅的副本
- 将相同共享指针的副本存储在不同的向量中是否是一种好的做法?
- 名称隐藏对静态函数继承的实例使用
- STL矢量中的隐藏副本