Другими словами, был ли какой-нибудь C ++, где компилятор не мог оптимизировать вызывающую функцию, основываясь на просмотре объявления без вызова функции, вызываемой?
Ответ на этот прямойвопрос нет. Но это само по себе сильно вводит в заблуждение.
Способность компилятора выполнять любые виды оптимизации для функции, которая может вызывать какую-то другую функцию с объявлением throw()
, крайне ограничена. Единственная реальная вещь, которую может сделать компилятор, - исключить выброс любого кода, имеющего дело с исключениями в функции вызывающей стороны. Но из-за природы упомянутого кода, он действительно будет применим, только если каждая функция, которую он вызывает, не выдает. В значительной степени это касается оптимизации компилятором функции, которая вызывает функцию throw()
.
Сегодня люди часто говорят о том, как noexcept
позволяет оптимизировать. И это правда;разумное использование noexcept
может сделать код, который работает с такими функциями, более эффективным. Но важно помнить, что использование noexcept
не позволяет оптимизировать компилятор;он позволяет оптимизировать пользовательский код .
Давайте возьмем классический случай vector<T>
для T
с поддержкой noexcept
. Этот случай не быстрее, потому что компилятор видит то, что иначе было бы серией копий, и автоматически изменяет их на перемещения только потому, что конструктор перемещения равен noexcept
. Это даже невозможно для компилятора;не допускается такая перестановка вашего кода, так как это будет обнаружимое изменение в зависимости от того, что делают ваши конструкторы копирования / перемещения.
Такие случаи становятся быстрее, потому что исходный кодреализация vector
обнаруживает, что T
не перемещается. Обнаружив этот случай, он затем вызовет совершенно другой путь к коду для перемешивания элементов vector
вокруг. Код, вызывающий функцию без выбрасывания, стал быстрее, потому что вызывающий код оптимизировал сам , а не потому, что компилятор обнаружил что-либо.
Проще говоря, оптимизация компиляторавызывающая функция никогда не была точкой объявления throw()
.