使用boost可选的缓存

时间:2014-10-15 11:30:40

标签: 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());
  return *transpose_;
}

};

简洁,似乎有效。这是好习惯吗?还有更好的方法吗?

2 个答案:

答案 0 :(得分:1)

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

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

我们可以决定同步的性能影响是否超过缓存的增益。与任何其他优化一样,问题是“我应该这样做吗?”最好的回答是“分析建议什么?”

答案 1 :(得分:0)

  

这是好习惯吗?

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

  

有更好的方法吗?

想不出更简单/惯用的东西。