c++:访问大型数据集中的重成员变量的最有效和简洁的方法
C++: Most efficient and concise way to access a heavy member variable in a large dataset
我有一个类,如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;
};
你可以看到,我添加了GetVariable
的const
版本;这使得在const A
和const A&
类型的对象上调用方法成为可能。
为了避免创建不需要的副本,也必须在调用代码中使用引用:
//---- Version#1
LargeType& var = a.GetVariable();
if(anotherLargeType == var){ DoSomething();}
DoOperation(var);
相关文章:
- 如果变量名称不跟在 char* 后面,const char* 是否有效?
- 比较C++变量的最有效方法
- 模板变量是否允许在多个翻译单元中并有效合并?
- 存储变量的更有效方法是什么?
- 函数参数的名称与调用函数时使用的变量相同是否有效?
- 关于读取有效 c++ 第 4 项(将非局部静态变量替换为局部静态变量)的问题
- 如何有效地实现将向量的数据分配给多个变量?
- 在 c++ 中使用右值设置类变量的最有效方法是什么
- 为什么这个带有 mov 算术的有效程序集在使用本地变量时无法编译
- 在 pthread_create() 中使用局部变量作为参数有效吗?
- 静态常量声明,变量的constexpr定义,有效的c ++?
- 如何有效地将底层数据从 std::string 移动到其他类型的变量?
- 移动变量是否有效,可以在 std::move 之后使用
- 如何有效地检测4个整数变量中的对称性
- 有效的问题 - 关于本地变量和全局变量,必须是基本的C/C 问题
- 只有先复制到临时变量中时,传递对字符串的引用才有效
- 将流定义为私有类变量似乎在Linux下有效,但在WindowsVisualStudio下无效
- 什么是有效的寄存器变量类型
- 从C++输入中收集数据时,是否有更有效的方法可以处理变量
- 使用类型推断声明变量是否与"classical way"变量名称后用括号初始化变量一样有效?