Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/128.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;:访问大型数据集中的重成员变量的最高效、最简洁的方法_C++_Performance - Fatal编程技术网

C++ C++;:访问大型数据集中的重成员变量的最高效、最简洁的方法

C++ C++;:访问大型数据集中的重成员变量的最高效、最简洁的方法,c++,performance,C++,Performance,我有一个类,比如a,它包含一个类型为LargeType的非平凡成员变量: class A { public: LargeType SetVariable(LargeType var){_var = var;} LargeType GetVariable(){return _var;} private: LargeType _var; }; 我循环遍历一个非常大的数据集,并在每次迭代中检索类型为a的对象a。我发现以下代码(每次迭代至少发生一次): 运行速度低于以下代码:

我有一个类,比如
a
,它包含一个类型为
LargeType
的非平凡成员变量:

class A {
public:
    LargeType SetVariable(LargeType var){_var = var;}
    LargeType GetVariable(){return _var;}
private:
    LargeType _var;
};
我循环遍历一个非常大的数据集,并在每次迭代中检索类型为
a
的对象
a
。我发现以下代码(每次迭代至少发生一次):

运行速度低于以下代码:

//---- Version#2
if(anotherLargeType == a1.GetVariable();){ DoSomething();}
DoOperation(a1.GetVariable());

我能理解为什么版本1比版本2运行得慢:在每次迭代中都会调用一个拷贝构造函数,所以要做更多的工作。然而,我认为版本#1更易于处理,而不必在一个循环中多次键入
a1.GetVariable()
。有没有办法重写我的类,使版本1和版本2的性能具有可比性?

您应该返回对成员变量的引用。这样,您就不会浪费时间创建和/或复制临时文件:

class A {
public:
    void SetVariable(const LargeType& var){_var = var;}
    LargeType& GetVariable(){return _var;}
    const LargeType& GetVariable() const {return _var;}
private:
    LargeType _var;
};
如您所见,我添加了
GetVariable
const
版本;这使得在类型为
const A
const A&
的对象上调用该方法成为可能

为了避免创建不需要的副本,您还必须在调用代码中使用引用:

//---- Version#1
LargeType& var = a.GetVariable();
if(anotherLargeType == var){ DoSomething();}
DoOperation(var);

为了完整性,我认为您应该展示调用代码应该如何利用这些引用。否则,OP仍然可以编写“Version#1”并进行复制,而不会获得任何优势。@ChrisDrew Fair:)根据您编写的代码,我不明白Version 2如何比Version 1快。每次调用
A::GetVariable
时,您都在调用一个复制构造函数,版本2调用
A::GetVariable
两次。除非编译器正在做一些我不知道的优化。
//---- Version#1
LargeType& var = a.GetVariable();
if(anotherLargeType == var){ DoSomething();}
DoOperation(var);