【问题标题】:What's the keyword mutable in the Moses source code for?Moses 源代码中的关键字 mutable 是做什么用的?
【发布时间】:2013-12-16 06:48:55
【问题描述】:

这是关于统计机器翻译系统Moses的源码。 在Mosesdecoder project,Factor 类中,关键字mutable 的这种奇怪用法:

class Factor {

    __SOME_OTHER_CODE__

    // FactorCollection writes here.
    // This is mutable so the pointer can be changed to pool-backed memory.
    mutable StringPiece m_string
    size_t m_id;

    __SOME_OTHER_CODE__
}

Factor.h的完整文件是here。我知道mutable 用于修改 const 成员函数中的成员变量,或者想要修改 lambda 表达式中的某些超出范围的变量。但是,我不明白 mutable 在这段代码中的作用。

我很感激任何提示。谢谢。

【问题讨论】:

    标签: c++ c++11 smt moses


    【解决方案1】:

    您提供的信息太少,我们只能猜测。

    也就是说,从评论来看,听起来他们有某种存储池,他们可能希望将字符串的存储移动到存储池中。与mutable 的大多数用法一样,它用于处理仍使对象在逻辑上未修改的按位修改(即,它们更改指针,使其指向相同的数据,但地址不同)。

    【讨论】:

    • 感谢您的快速回复。这个m_string 东西被另一个类修改了。我经常看到一个成员函数在同一个类中修改一个以mutable 标记的成员变量。这就是为什么我觉得奇怪。
    • @YuhuanJiang:如果它是一个“池”,很可能有某种池管理器“进入”以修改m_string:例如-如果池被释放,它可能会设置@987654325 @ 为空,或在下次访问时抛出异常。您没有提供太多关于您所看到的、您的预期以及差异为何令人困惑的信息。
    • @YuhuanJiang:mutable 的主要目的是允许通过const 引用或指针修改对象的可变字段。只要对象保持逻辑上不变,这通常是安全的。例如,如果m_string 持有的字符串没有改变,那么m_string 的内部表示是否改变也没关系。从外观上看,m_string 一直保持不变。在此示例中,似乎某些内存管理代码可能希望移动存储字符串文本的位置而不更改该文本。那是“逻辑上的 const”。
    猜你喜欢
    • 2011-03-26
    • 1970-01-01
    • 2011-09-04
    • 2018-08-12
    • 2011-08-16
    • 1970-01-01
    • 2010-11-25
    • 1970-01-01
    相关资源
    最近更新 更多