Встроенные функции 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++), но даже с таким ключевым словом виртуальные вызовы виртуальных функций-членов не будут встроены.
Я столкнулся с подобными проблемами и обнаружил, что он работает только в том случае, если встроенная функция записана в заголовочном файле.