如果第一次计算,则加载第二次模式

时间:2015-10-17 16:10:34

标签: c++ c++11

我想问一下,使用这种模式是否是一种好习惯:

我有一个包含一些原始数据的类。我想从这些数据中得出一些信息,例如:

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

3 个答案:

答案 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
};