允许 const 成员函数使用 mutable 编辑一些成员变量
Allow const member function to edit some member variable using mutable
我想应用 Memoization 技术来提高 "Line" class 的性能,它是这样的:
class line{
public:
line() = default;
~line() = default;
float segment_length() const;
Tpoint first;
Tpoint second;
};
如你所见,成员函数segment_length
被标记为const
,因为它只是计算长度,并不影响class。但是,在应用 Memoization 之后,class 行变为:
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
不再是常量,因为它改变了norm_of_line_cashed
memebnre 变量。
问题:
在这种情况下正确的方式是什么:
- 将
segment_length
保留为 non-const
成员函数。
- 再次
const
并标记norm_of_line_cashed
为mutable
。
我会将 segment_length
标记为 const
,并将 norm_of_line_cashed
* 标记为 mutable
。
这是遵循逻辑常量而不是按位或物理常量的概念。你只是在修改外部世界不可见的内部状态,所以即使你在技术上修改你的 class,逻辑常量也会被保留。这正是 mutable
的目的,这似乎是一个可靠的设计选择。
一个注意事项:您可能希望有一些 bool
变量(或 std::experimental::optional
)来跟踪您是否有缓存的值,而不是依赖于脆弱且可以导致以后头痛。
*也许你的意思是 "cached"。
我想应用 Memoization 技术来提高 "Line" class 的性能,它是这样的:
class line{
public:
line() = default;
~line() = default;
float segment_length() const;
Tpoint first;
Tpoint second;
};
如你所见,成员函数segment_length
被标记为const
,因为它只是计算长度,并不影响class。但是,在应用 Memoization 之后,class 行变为:
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
不再是常量,因为它改变了norm_of_line_cashed
memebnre 变量。
问题:
在这种情况下正确的方式是什么:
- 将
segment_length
保留为non-const
成员函数。 - 再次
const
并标记norm_of_line_cashed
为mutable
。
我会将 segment_length
标记为 const
,并将 norm_of_line_cashed
* 标记为 mutable
。
这是遵循逻辑常量而不是按位或物理常量的概念。你只是在修改外部世界不可见的内部状态,所以即使你在技术上修改你的 class,逻辑常量也会被保留。这正是 mutable
的目的,这似乎是一个可靠的设计选择。
一个注意事项:您可能希望有一些 bool
变量(或 std::experimental::optional
)来跟踪您是否有缓存的值,而不是依赖于脆弱且可以导致以后头痛。
*也许你的意思是 "cached"。