Встроенные функции C ++ с использованием GCC - зачем этот ВЫЗОВ?
Вопрос
Я тестировал встроенные вызовы функций в C ++.
Thread model: win32
gcc version 4.3.3 (4.3.3-tdm-1 mingw32)
Страуструп на языке программирования C++ wirtes:
Встроенный спецификатор - это подсказка компилятору, что он должен попытаться сгенерировать код [...] встроенным, а не закладывать код для функции один раз, а затем вызывать через обычный механизм вызова функции.
Однако я обнаружил, что сгенерированный код просто не является встроенным.Существует ЗВОНИТЬ инструмент для исквар функция.
Почему это происходит?Как тогда я могу использовать встроенные функции?
Редактировать: Используемые параметры командной строки:
**** 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 ++), но даже с таким ключевым словом виртуальные вызовы виртуальных функций-членов не будут встроены.
Я столкнулся с подобными проблемами и обнаружил, что это работает только в том случае, если встроенная функция записана в заголовочный файл.