我想问一下,使用这种模式是否是一种好习惯:
我有一个包含一些原始数据的类。我想从这些数据中得出一些信息,例如:
class my_class{
public:
int get_integers_sum();
private:
std::vector<int> all_integers;
};
假设all_integers不会被更改。这样做很好:
class my_class{
public:
int get_integers_sum(){
if(sum==-1){
sum=sum=std::acculmate(all_integeres);// the proper code ofcourse
}
return sum;
}
private:
std::vector<int> all_integers;
int sum=-1;
};
答案 0 :(得分:1)
当您知道输入不会改变时,这是一个有用的模式。此方法的通用名称为memoization。您的实现有点缺陷,因为all_integers
的总和实际上可能是-1。
答案 1 :(得分:1)
测量并找出;从不尝试优化而不进行测量。请记住,在现代CPU上,计算速度快,内存访问速度慢,因此答案可能不是您所期望的。
这是在您担心多个线程安全地调用此代码之前。
答案 2 :(得分:1)
据我所知,这种缓存方法很好。当你知道经常调用get_integers_sum()时,它基本上是有意义的,但all_integers很少变化。 但是你应该保持const的正确性,这是可以使用mutable的情况之一。
class my_class{
public:
int get_integers_sum() const { // <- adding const
if(sum==-1){
sum=std::acculmate(all_integeres);
}
return sum;
}
private:
std::vector<int> all_integers;
mutable int sum=-1; // <- adding mutable so it can be changed in const function
};