Для чего ключевое слово mutable в исходном коде Moses?

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

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


person Yuhuan Jiang    schedule 16.12.2013    source источник


Ответы (1)


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

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

person Jerry Coffin    schedule 16.12.2013
comment
Спасибо за этот быстрый ответ. Эта вещь m_string изменена другим классом. Обычно я вижу, как функция-член изменяет переменную-член, отмеченную mutable в том же классе. Вот почему я чувствую себя странно. - person Yuhuan Jiang; 16.12.2013
comment
@YuhuanJiang: если это пул, вполне может быть какой-то менеджер пула, который может изменить m_string: например, если пул освобожден, он может установить m_string пустым или выдать исключение при следующем доступе. Вы не даете много информации о том, что видели, чего ожидали и почему разница сбивает с толку. - person Tony Delroy; 16.12.2013
comment
@YuhuanJiang: Основная цель mutable — позволить изменять изменяемые поля объекта даже с помощью ссылки или указателя const. Как правило, это безопасно, пока объект остается логически постоянным. Например, если строка, содержащаяся в m_string, не изменяется, не имеет значения, изменится ли внутреннее представление m_string. По внешнему виду m_string остался неизменным. В этом примере кажется, что какой-то код управления памятью может захотеть переместиться туда, где хранится текст строки, без изменения этого текста. Это логически константа. - person Joe Z; 16.12.2013