C++, способен ли современный компилятор оптимизировать следующее?

Рассмотрим следующую ситуацию:

  • Есть некая структура данных, пускай это будет std::unordered_map;
  • Эта структура содержит определенные объекты;
  • В какой-то момент мы обращаемся к объекту по ключу key;
  • Затем делаем много всего, что гарантированно не изменяет состояние отображения и объектов в нем;
  • Затем мы вновь обращаемся к объекту по ключу key;

Мой вопрос заключается в следующем: способен ли современный компилятор понять, что повторное обращение к объекту, который не менялся, как и структура данных, в которой он находится, является избыточным?

То есть, нужно ли оптимизировать такие вещи руками?


Ответы (1 шт):

Автор решения: avp

По крайней мере g++ 7.4.0 -O3 такую оптимизацию не смог провести ни с unorderd_map, ни с map.

В простейшем тесте std::map<int, int> x; x[2] = 1; std::cout << x[2] << '\n'; return x[2]; функция поиска в RB-tree вызывается дважды, хотя ее код генерится в том же ассемблерном файле.

Для std::unordered_map картина та же самая.

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

→ Ссылка