C Как влияет изменяемое ключевое слово на производительность контейнера?

#c #mutable

#c #изменяемый

Вопрос:

Я хочу знать, как mutable влияет на контейнер (карта, вектор, список, …). Кроме того, что я должен иметь в виду?

Комментарии:

1. Люди будут писать книги о ключевом слове mutable в целом, может быть, вы сможете сузить его, с небольшим количеством кода, показывающего, что это значит в вашем конкретном случае.

Ответ №1:

mutable например const , это просто время компиляции. Это просто позволяет вам изменять эту переменную в постоянном контексте. Во время выполнения нет никакой разницы, объявили вы контейнер mutable или нет.

 class Foo{
  mutable int i;

public:
  void foo() const{
    // constant context, but you can modify `i`
    i = 5;
  }
};
 

Комментарии:

1. Его также можно использовать как подсказку для оптимизатора

2. Это влияет на то, что может сделать оптимизатор.

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

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

5. @ildjam Вы правы, я неправильно запомнил причины, по которым const обычно не помогает оптимизировать компилятор. Фактические причины, по которым это не помогает, здесь: gotw.ca/gotw/081.htm