Будет ли функция исключения C++ останавливаться от встроенной функции?

Предположим, у меня есть очень простая функция, и я ожидаю, что компилятор ее встроит. Но мне может понадобиться создать исключение, если я увижу недопустимый ввод, помешает ли это компилятору встроить функцию?


person Ralph Zhang    schedule 21.09.2011    source источник
comment
Краткий ответ: нет. Встраивание не зависит от обработки исключений, поскольку это просто копирование/вставка функции в вызывающем объекте.   -  person Mysticial    schedule 21.09.2011
comment
Если я компилирую с отключенной обработкой исключений, я избавляюсь от кучи предупреждений, и все они выглядят так: ... Inlining of specified subprogram failed due to the presence of a C++ exception handler: utills::ScopeFile<utills::MpiAbbortOnError>::~ScopeFile(). Обратите внимание, что то, на что он жалуется, даже не является исключением, но похоже, что с деструкторами нужно обращаться таким же образом. Эти предупреждения появляются на этапе компоновки, когда я делаю xlC object1.o object2.o -o my_binary (xlC — это компилятор IBM).   -  person Anton Daneyko    schedule 07.02.2013
comment
Я думал, что это какая-то конкретная проблема с компилятором IBM, но в кратком (к сожалению) разговоре с человеком, намного более просвещенным, чем я, я убедился, что это общая проблема. К сожалению, поскольку я не такой просвещенный, я не могу изложить аргументы, но я считаю ключевыми словами, что устранение стека невозможно, если у вас есть какие-то объекты, такие как исключения. Мне было бы очень-очень интересно прочитать подробное объяснение этого. И у меня скорость работы приложения удваивается (это не преувеличение), когда я отключаю обработку исключений.   -  person Anton Daneyko    schedule 07.02.2013
comment
Должен отметить, что приложение достаточно нишевое: оно выполняет симуляцию определенного физического процесса (диффузии) и проводит 90% времени в небольшом цикле, не превышающем 100 строк кода. Итак, еще один короткий ответ: да, это может помешать встраиванию. У меня есть доказательства этого на руках. И уж тем более это может быть ход фундаментальной проблемы, не связанной с конкретным компилятором.   -  person Anton Daneyko    schedule 07.02.2013
comment
@Mysticial Я был бы очень рад услышать, что вы думаете об этом.   -  person Anton Daneyko    schedule 07.02.2013
comment
@mezhaka Я сам не уверен, так как у меня никогда не было обработки исключений в критически важном для производительности коде. Но если бы мне пришлось угадывать, это, вероятно, просто ограничение компилятора. Либо это, либо компилятор OCD о сохранении трассировки стека исключений, которая соответствует исходному коду. Если функция встроена, то в трассировке стека будут отсутствовать встроенные вызовы. (Возможно, есть способ вернуть их обратно без снижения производительности. Но я не очень хорошо знаком с тем, как обработчики исключений обходят стек.)   -  person Mysticial    schedule 07.02.2013
comment
Перемотайте вперед до 1:07:00, чтобы узнать об оптимизации и исключениях компилятора: channel9.msdn.com/Events/GoingNative/GoingNative-2012/   -  person Anton Daneyko    schedule 17.04.2013


Ответы (3)


Компилятор может отказаться от встраивания по любой причине. gcc перечисляет причины, по которым он может не встраивать функцию, но генерация исключений не является среди них. Кроме того, опция -Winline заставит компилятор выдать предупреждение, если он не может встроить функцию, которую вы пометили как встроенную. Вы можете попробовать это и посмотреть, делаете ли вы что-нибудь, чтобы предотвратить встраивание.

person David Nehme    schedule 21.09.2011

Для компилятора вполне разумно и допустимо встраивать функцию, которая выдает исключение.

person David Heffernan    schedule 21.09.2011

Я только что столкнулся с этой ситуацией с MSVC версии 19. Функция, которая выдает исключение, не будет встроена при компиляции для x86. Если я заменю throw на exit(1) или скомпилирую для x86-64, он отлично встроится.

person Alexey B.    schedule 12.11.2017
comment
Поведение, при котором функция не встраивается в оператор try, по-видимому, задокументировано здесь: docs.microsoft.com/en-us/cpp/error-messages/compiler-warnings/ - person Michał W. Urbańczyk; 16.04.2018