可选boost缓存

cacheing with boost optional

本文关键字:缓存 boost 可选      更新时间:2023-10-16

我想在一个不可变的类中创建一个缓存的结果,比如:

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

它简明扼要,似乎行之有效。这种做法好吗?有更好的方法吗?

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

因此,为了回答您的问题:它本身没有什么问题。但为了使您的类与标准库一起使用,您实际上应该同步对transpose_(或任何其他可变成员)的访问。

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

来回答

这种做法好吗?

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

有更好的方法吗?

想不出比这更简单/更地道的了。