Встроенные функции C ++ с использованием GCC - зачем этот ВЫЗОВ?

StackOverflow https://stackoverflow.com/questions/934529

  •  06-09-2019
  •  | 
  •  

Вопрос

Я тестировал встроенные вызовы функций в C ++.

Thread model: win32
gcc version 4.3.3 (4.3.3-tdm-1 mingw32)

Страуструп на языке программирования C++ wirtes:

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

Однако я обнаружил, что сгенерированный код просто не является встроенным.Существует ЗВОНИТЬ инструмент для исквар функция.

alt text

Почему это происходит?Как тогда я могу использовать встроенные функции?

Редактировать: Используемые параметры командной строки:

**** Build of configuration Debug for project InlineCpp ****

**** Internal Builder is used for build               ****
g++ -O0 -g3 -Wall -c -fmessage-length=0 -osrc\InlineCpp.o ..\src\InlineCpp.cpp
g++ -oInlineCpp.exe src\InlineCpp.o
Это было полезно?

Решение

Не существует универсального способа C ++ заставить компилятор создавать встроенные функции.Обратите внимание на слово "подсказка" в процитированном вами тексте - компилятор не обязан вас слушать.

Если вам действительно, абсолютно необходимо сделать что-то встроенным, вам понадобится ключевое слово, специфичное для компилятора, ИЛИ вам нужно будет использовать макросы вместо функций.

Редактировать:njsf дает правильное ключевое слово gcc в своем ответе.

Другие советы

Как упоминал Майкл Кон, ключевое слово inline всегда является подсказкой, и GCC в случае вашей функции решил не вставлять его.

Поскольку вы используете Gcc, вы можете принудительно встроить атрибут __((always_inline)).

Пример:

 /* Prototype.  */
 inline void foo (const char) __attribute__((always_inline));

Источник:Встроенные документы GCC

Вы смотрите на отладочную сборку (оптимизация отключена)?Компиляторы обычно отключают встраивание в "отладочные" сборки, потому что они усложняют отладку.

В любом случае, inline указанный действительно является подсказка.Компилятору не требуется встроять функцию.Существует ряд причин, по которым любой компилятор может решить проигнорировать встроенную подсказку:

  • Компилятор может быть простым и не поддерживать встраивание
  • Компилятор может использовать внутренний алгоритм, чтобы решить, что нужно встроить, и игнорировать подсказки.
    (иногда компилятор может выполнить работу лучше, чем вы, возможно, при выборе того, что нужно встроить, особенно в сложных архитектурах, таких как IA64)
  • Компилятор может использовать свою собственную эвристику, чтобы решить, что, несмотря на подсказку, встраивание не улучшит производительность

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

Кроме того, я заметил, что вы выполняете отладочную сборку.На самом деле я не знаю, но возможно, что компилятор отключает встроенность для отладочных сборок, потому что это усложняет работу отладчика...

Это подсказка, и исполнитель может проигнорировать подсказку.Я думаю, я читал кое-что, где GCC обычно игнорирует это.Я помню, что слышал о существовании флага, но он по-прежнему не работает в 100% случаев.(Я пока не нашел ссылку).

Отметить:-finline-функции включены на уровне оптимизации -O3.

Использовать ли его встроенным, зависит от компилятора.Свободно ли игнорировать встроенный подсказка.Некоторые компиляторы имеют определенное ключевое слово (например __forceinline в VC ++), но даже с таким ключевым словом виртуальные вызовы виртуальных функций-членов не будут встроены.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top