Все члены класса имеют размер (по определению sizeof
), который составляет не менее 1
. Это верно и для mutable
, а также означает, что все члены класса должны занимать некоторый диапазон местоположений в памяти.
Единственное, что особенное в члене mutable
, состоит в том, что его значение можно изменить, даже если оно находится в пределах объекта const
. Это зависит от того, как это достигается. Как правило, компилятор принудительно выполняет настройку во время компиляции. Другими словами, если объект равен const
, его члены также логически const
, и делается попытка изменить (или вызвать операцию не const
) на любом члене, тогда код не будет компилироваться, если только этот член не является mutable
.
На самом деле нет необходимости в объекте const
или его членах, которые будут выгружаться в память readonly во время выполнения.Если это действительно сделано, тогда необходимо будет сделать особый режим, чтобы его члены могли быть изменены, даже если изменения в других членах запрещены. Например, все члены объекта могут быть помещены в модифицируемую память, и только те, которые не изменяются, помечены (например, с поддержкой операционной системы), поэтому они не могут быть изменены во время выполнения.
Общей причиной использования изменяемых элементов является сохранение результатов от дорогостоящих операций, которые повторяются (дают те же результаты для одних и тех же входов). Если результаты не нужны, дорогостоящие операции также не нужны. Если к результату необходимо получить доступ повторно, то изменяемые члены позволяют сохранить результаты в первый раз, а не многократно выполнять дорогостоящие операции.
Спасибо всем за ценные замечания! – Zoolander