我想应用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变量。
问题:
在这种情况下,正确的方式是什么:
segment_length
保留为non-const
成员函数。const
并将norm_of_line_cashed
标记为mutable
。答案 0 :(得分:4)
我会将segment_length
标记为const
并将norm_of_line_cashed
*标记为mutable
。
这遵循逻辑constness 的概念,而不是按位或物理常量。您只修改了外部世界不可见的内部状态,因此即使您在技术上修改了类,也会保留逻辑常量。这正是mutable
的用途,这似乎是一个可靠的设计选择。
一个注意事项:您可能希望有一些bool
变量(或std::experimental::optional
)来跟踪您是否有缓存的值而不是依赖于易碎的标志值并且可能导致未来的头痛。
*也许你的意思是"缓存"。