我想应用Memoization技术来提高"Line"类的性能,如下所示:
class line{
public:
line() = default;
~line() = default;
float segment_length() const;
Tpoint first;
Tpoint second;
};
如您所见,成员函数 segment_length
标记为 const
,因为它只计算长度而不影响类 . 但是,在应用Memoization之后,类线成为:
class line{
public:
line() = default;
~line() = default;
float segment_length();
Tpoint first;
Tpoint second;
private:
float norm_of_line_cashed = -1; //for optimization issue
};
成员函数 segment_length
不再是const,因为它改变了 norm_of_line_cashed
memebnre变量 .
The question:
在这种情况下,正确的方式是什么:
-
将
segment_length
保留为non-const
成员函数 . -
再次将其设为
const
并将norm_of_line_cashed
标记为mutable
.
1 回答
我将
segment_length
标记为const
并将norm_of_line_cashed
*标记为mutable
.这遵循逻辑常量的概念而不是按位或物理常量 . 您只修改了外部世界不可见的内部状态,因此即使您在技术上修改了类,也会保留逻辑常量 . 这正是
mutable
的制作,这似乎是一个坚实的设计选择 .一个注意事项:您可能希望有一些
bool
变量(或std::experimental::optional)来跟踪您是否有缓存的值而不是依赖于易碎的标志值并且可能导致将来出现令人头疼的问题 .*也许你的意思是“缓存” .