【问题标题】:Allow const member function to edit some member variable using mutable允许 const 成员函数使用 mutable 编辑某些成员变量
【发布时间】:2016-03-03 20:13:41
【问题描述】:

我想应用Memoization 技术来提高“Line”类的性能,如下所示:

class line{
    public:
        line() = default;
        ~line() = default;

        float segment_length() const;

        Tpoint first;
        Tpoint second;
    };

如您所见,成员函数segment_length 被标记为const,因为它只是计算长度而不影响类。但是,在应用了 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 不再是 const,因为它改变了norm_of_line_cashed memebnre 变量。

问题:

在这种情况下正确的方式是什么:

  • segment_length 保留为non-const 成员函数。
  • 再次将其设为const,并将norm_of_line_cashed 标记为mutable

【问题讨论】:

  • line一定要在多线程环境下工作吗?
  • 是和否,整个过程可以并行调用,但每个过程都有自己的行。因此,访问同一行的线程不超过一个。

标签: c++ c++11 memoization mutable


【解决方案1】:

我会将segment_length 标记为const,并将norm_of_line_cashed* 标记为mutable

这是遵循 logical constness 而不是 bitwisephysical constness 的概念。您只是在修改外部世界不可见的内部状态,因此即使您在技术上修改您的类,也可以保留逻辑常量。这正是 mutable 的用途,这似乎是一个可靠的设计选择。

注意:您可能需要一些bool 变量(或std::experimental::optional)来跟踪您是否有缓存的值,而不是依赖于易碎且可能在未来导致头疼的标志值.

*也许你的意思是“缓存”。

【讨论】:

  • 是的,我想那些日子我很担心钱 :D 谢谢你的回答。
  • 并且bool标志可以替换为optional
  • 请注意,从 C++11 开始,标准库有权期望 const 操作是线程安全的。所以mutable norm_of_line_cached 应该以某种方式同步 - 原子的或受互斥锁或类似的保护。
猜你喜欢
  • 1970-01-01
  • 2020-09-29
  • 2011-11-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-04
  • 1970-01-01
  • 2016-05-01
相关资源
最近更新 更多