我想在一个不可变的类中创建一个缓存的结果,如下所示:
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_;
}
};
简洁,似乎有效。这是好习惯吗?还有更好的方法吗?
答案 0 :(得分:1)
请注意,由于C ++ 11引入了C ++内存的并发语义。执行模型,成员函数的const
限定符获得了额外的含义:线程安全。也就是说,应该可以同时调用对象上的const
函数。实际上,如果您将对象与标准库一起使用,那么必须(这是与标准库交互的先决条件之一)。
所以,回答你的问题:它没有任何内在错误。但是为了使您的类可以与标准库一起使用,您实际上应该同步对transpose_
(或任何其他可变成员)的访问。
我们可以决定同步的性能影响是否超过缓存的增益。与任何其他优化一样,问题是“我应该这样做吗?”最好的回答是“分析建议什么?”
答案 1 :(得分:0)
这是好习惯吗?
是的,除非你实际上并不需要它。这是一种优化,因此您可能根本不需要缓存(即,如果您不经常调用transpose()
,或者每个实例最多调用一次)。
有更好的方法吗?
想不出更简单/惯用的东西。