2015-08-16 6 views
3

У меня есть понимание взаимозаменяемых переменных в C++.Mutable variable memory location

  1. Его специальный класс хранения.
  2. Измененная переменная может быть изменена постоянным объектом.
  3. Примером случая, когда вы хотите использовать изменяемую переменную, является случай, когда вы не хотите выполнять дорогостоящую операцию, чтобы получить результат, если это специально не задано. если вас спросили, ваша программа выполнит операцию один раз и кэширует результат в изменяемой переменной.

Мой вопрос с точки зрения памяти. Где компилятор хранит изменяемую переменную в памяти? С его модификацией, то это не будет «только для чтения» памяти.

+0

Спасибо всем за ценные замечания! – Zoolander

ответ

2

Предположительно, это специфичный компилятор, но я полагаю, что большинство компиляторов просто решили всегда находить классы (весь класс) с изменяемыми членами в неконстантную память, чтобы это допускалось.

3

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

2

Это полностью зависит от компилятора, который может выполнять анализ утечки и определять объект, который никогда не может быть изменен, и в этом случае он может быть записан в разделе двоичного кода read-only. Спецификатор класса mutable освобождает только требование времени компиляции.

Объекты должны быть выделены в порядке декларации, поэтому, независимо от спецификации класса хранения, все переменные находятся в одной области памяти. Однако ничто не помешало бы бит read-only быть установленным в области байтов const, если машина поддерживала его.

1

Все члены класса имеют размер (по определению sizeof), который составляет не менее 1. Это верно и для mutable, а также означает, что все члены класса должны занимать некоторый диапазон местоположений в памяти.

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

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

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

Смежные вопросы