2013-12-16 3 views
4

Об этом источнике исходный код системы статистического машинного перевода Moses. В Factor классе Mosesdecoder project, есть это странное использование ключевого слова 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 используется, когда вы хотите изменить вариант-член в функции-член-член или когда вы хотите изменить некоторую переменную вне области видимости в выражении лямбда. Однако я не понимаю, что делает mutable в этом коде.

Я ценю любой намек. Спасибо.

ответ

4

Вы предоставили достаточно информации о том, что обо всем, что мы можем сделать, это догадываться.

Это, как говорится, из комментария, похоже, что у них есть какой-то пул хранения, и они могут захотеть переместить хранилище для строки в пул хранения. Как и в большинстве случаев использования mutable, он имеет дело с поразрядной модификацией, которая по-прежнему оставляет объект логически немодифицированным (т. Е. Они меняют указатель, поэтому он указывает на одни и те же данные, но на другой адрес).

+0

Благодарим вас за этот быстрый ответ. Эта вещь 'm_string' модифицируется другим классом. Обычно я вижу, что функция-член модифицирует переменную-член, помеченную 'mutable' в том же классе. Вот почему я чувствую себя странно. –

+0

@YuhuanJiang: если это «пул», может быть какой-то менеджер пула, который «достигает», чтобы изменить «m_string»: например - если пул удалил, он мог бы установить 'm_string' пустым или выбросить исключение при следующем доступе. Вы не даете много информации о том, что вы видели, что вы ожидали, и почему разница в замешательстве. –

+0

@YuhuanJiang: Основная цель 'mutable' - разрешить изменение изменяемых полей объекта даже с помощью ссылки или указателя' const'. Это, как правило, безопасно, пока объект остается _логически постоянным. Например, если строка, содержащаяся в 'm_string', не изменяется, не имеет значения, изменится ли внутреннее представление' m_string'. По внешнему виду, 'm_string' оставался постоянным. В этом примере кажется, что некоторый код управления памятью может захотеть переместиться туда, где текст строки сохраняется без изменения этого текста. Это «логически сост.». –