c++:访问大型数据集中的重成员变量的最有效和简洁的方法

C++: Most efficient and concise way to access a heavy member variable in a large dataset

本文关键字:变量 有效 方法 简洁 成员 大型 访问 数据 数据集 c++ 集中      更新时间:2023-10-16

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

class A {
public:
    LargeType SetVariable(LargeType var){_var = var;}
    LargeType GetVariable(){return _var;}
private:
    LargeType _var;
};

我循环遍历一个非常大的数据集,并在每次迭代中检索A类型的对象a。我发现以下代码(每次迭代至少出现一次):

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

运行速度比下面的代码慢:

//---- 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;
};

你可以看到,我添加了GetVariableconst版本;这使得在const Aconst A&类型的对象上调用方法成为可能。

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

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