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

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

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

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

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

Однако я обнаружил, что сгенерированный код просто не встроен. Существует функция CALL для функции isquare.

http://i42.tinypic.com/8ys3f4.jpg

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

РЕДАКТИРОВАТЬ: используемые параметры командной строки:

**** 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

7 ответов

Решение

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

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

РЕДАКТИРОВАТЬ: njsf дает правильное ключевое слово gcc в своем ответе.

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

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

Пример:

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

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

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

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

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

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

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

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

Флаг: -finline-functions включен на уровне оптимизации -O3.

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

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

Другие вопросы по тегам