C++ 使用boost选项进行缓存

C++ 使用boost选项进行缓存,c++,boost,C++,Boost,我想在一个非可变类中创建一个缓存结果,如下所示: class Rot3() { mutable boost::optional<Matrix3> transpose_; Rot3 inverse() const {...} Matrix3 matrix() const {...} const Matrix3& transpose() const { if (!transpose_) transpose_.reset(inverse().matrix());

我想在一个非可变类中创建一个缓存结果,如下所示:

class Rot3() {

mutable boost::optional<Matrix3> transpose_;

Rot3 inverse() const {...}
Matrix3 matrix() const {...}

const Matrix3& transpose() const {
  if (!transpose_)
    transpose_.reset(inverse().matrix());
  return *transpose_;
}

};
class Rot3(){
可变增强::可选转置;
Rot3逆()常数{…}
Matrix3矩阵()常数{…}
常量Matrix3&转置()常量{
if(!转置)
转置重置(逆().matrix());
返回*转置;
}
};
这是简洁的,似乎工作。这是好的做法吗?有更好的办法吗

这是好的做法吗

是的,除非你真的不需要它。这是一种优化,因此您可能根本不需要缓存(即,如果您不经常调用
transpose()
,或者每个实例最多调用一次)

有更好的办法吗


不能想到任何更简单/惯用的东西。

< P>注意到,由于C++ 11向C++内存和执行模型引入并发语义,成员函数的 const < /Cult>限定符获得了额外的含义:线程安全。也就是说,应该可以同时调用对象上的
const
函数。事实上,如果将对象与标准库一起使用,则必须如此(这是与标准库交互的先决条件之一)

所以,回答你的问题:它没有本质上的问题。但是,为了使您的类能够与标准库一起使用,您实际上应该同步对
transpose_uu
(或任何其他可变成员)的访问


由我们来决定同步对性能的影响是否超过缓存的好处。与任何其他优化一样,“我应该这样做吗?”这一问题最好用“评测建议是什么?”来回答。

可选
是我的第一选择,因为我必须实现一个简单的缓存结果,而且从来没有遇到过任何问题。在您的情况下,可能更明智的做法是优化存储,并让您的类的客户端执行缓存(如果需要)。如果您想要真正的缓存(而不是每个实例),请考虑使用类似ebost Flyweight的东西(引用计数过期和许多其他东西,如唯一标识标记)或例如,谢谢。我发现上述方案的另一个问题是,当在调用一次transpose之前进行复制时,将复制空的可选项。所以,复制10个副本并调用所有副本上的转置并不能保存任何内容。