C++, способен ли современный компилятор оптимизировать следующее?
Рассмотрим следующую ситуацию:
- Есть некая структура данных, пускай это будет
std::unordered_map; - Эта структура содержит определенные объекты;
- В какой-то момент мы обращаемся к объекту по ключу
key; - Затем делаем много всего, что гарантированно не изменяет состояние отображения и объектов в нем;
- Затем мы вновь обращаемся к объекту по ключу
key;
Мой вопрос заключается в следующем: способен ли современный компилятор понять, что повторное обращение к объекту, который не менялся, как и структура данных, в которой он находится, является избыточным?
То есть, нужно ли оптимизировать такие вещи руками?
Ответы (1 шт):
По крайней мере 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 (следовательно, реализация может быть заменена при линковке) и у компайлера нет гарантий, что ее вызов с одними и теми же аргументами возвращает одинаковое значение.