2013-12-16 18 views
4

這是關於統計機器翻譯系統Moses的源代碼。 在FactorMosesdecoder project,的有這種怪用關鍵字mutable的:Moses源代碼中的關鍵字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在這段代碼中的作用。

我欣賞任何提示。謝謝。

回答

4

您已經提供了足夠的信息,以至於我們所能做的只是猜測。

也就是說,從評論看來,這聽起來像是他們有某種存儲池,他們可能希望將該字符串的存儲移動到存儲池中。像mutable的大多數用法一樣,它將處理按位修改,仍然使對象在邏輯上不被修改(即,它們改變指針,使其指向相同的數據,但是在不同的地址處)。

+0

感謝您的快速回復。這個'm_string'由另一個類修改。我通常會看到一個成員函數在同一個類中修改由'mutable'標記的成員變量。這就是我感到奇怪的原因。 –

+0

@YuhuanJiang:如果它是一個「池」,可能會有某種池管理器「進入」來修改'm_string':例如,如果池解除分配,可能會將m_string設置爲空,或者下次訪問時拋出異常。您沒有提供有關您所看到的內容,期望的內容以及差異之所以令人困惑的原因。 –

+0

@YuhuanJiang:'mutable'的主要目的是允許通過'const'引用或指針修改對象的可變字段。只要對象保持_logic_常量,這通常是安全的。例如,如果'm_string'所保存的字符串沒有改變,那麼'm_string'的內部表示是否改變並不重要。通過外觀,「m_string」保持不變。在這個例子中,看起來有些內存管理代碼可能想移動存儲字符串文本的位置而不改變該文本。這是「邏輯常量」。 –