С++ встроенные функции с использованием GCC - почему CALL?
Я тестировал встроенные вызовы функций в С++.
Thread model: win32
gcc version 4.3.3 (4.3.3-tdm-1 mingw32)
Stroustrup в языке программирования С++:
Спецификатор inline является подсказкой для компилятора, что он должен попытаться сгенерировать код [...] inline, а не закладывать код для функции один раз, а затем вызывать обычный механизм вызова функции.
Однако, я обнаружил, что сгенерированный код просто не встроен. Существует функция CALL для функции isquare.
alt text http://i42.tinypic.com/8ys3f4.jpg
Почему это происходит? Как я могу использовать встроенные функции?
EDIT: Используемые параметры командной строки:
**** 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
Ответы
Ответ 1
Существует не общий способ С++, чтобы заставить компилятор создавать встроенные функции. Обратите внимание на слово "подсказка" в тексте, который вы указали, - компилятор не обязан вас слушать.
Если вам действительно нужно сделать что-то в строке, вам понадобится конкретное ключевое слово для компилятора, или вам нужно будет использовать макросы вместо функций.
EDIT: njsf дает правильное ключевое слово gcc в своем ответе.
Ответ 2
Как упоминал Майкл Коне, ключевое слово inline всегда является подсказкой, и GCC в случае вашей функции решил не встраивать его.
Поскольку вы используете Gcc, вы можете принудительно вставить строку с __attribute ((always_inline)).
Пример:
/* Prototype. */
inline void foo (const char) __attribute__((always_inline));
Источник: встроенные документы GCC
Ответ 3
Вы смотрите на сборку отладки (отключены оптимизации)? Компиляторы обычно отключают встраивание в "отладочные" сборки, потому что они затрудняют отладку.
В любом случае указанный inline
действительно является подсказкой. Компилятор не обязан встраивать функцию. Существует ряд причин, по которым любой компилятор может решить игнорировать встроенный намек:
- Компилятор может быть простым и не поддерживать inlining
- Компилятор может использовать внутренний алгоритм, чтобы решить, что делать, и игнорировать подсказки.
(иногда компилятор может сделать лучшую работу, чем вы можете сделать при выборе встроенного, особенно в сложных архитектурах, таких как IA64).
- Компилятор может использовать свою собственную эвристику, чтобы решить, что, несмотря на подсказку, вложение не улучшит производительность.
Ответ 4
Inline - это не что иное, как предложение компилятору о том, что, если возможно встроить эту функцию, компилятор должен подумать об этом. Некоторые функции он будет автоматически подключаться, потому что они настолько просты, и другие функции, которые вы предлагаете, это не так, потому что они сложны.
Кроме того, я заметил, что вы делаете сборку отладки. Я действительно не знаю, но возможно, что компилятор отключает inlining для отладочных сборников, потому что это затрудняет работу отладчика...
Ответ 5
Это подсказка, и выбор собеседника может игнорировать намек. Я думаю, что я читал некоторые, где GCC обычно игнорирует это. Я помню, что был флаг, но он по-прежнему не работает в 100% случаев. (Я еще не нашел ссылку).
Флаг: -финиловые функции включаются на уровне оптимизации -O3.
Ответ 6
Независимо от того, встраивается ли он в компилятор. Можно ли игнорировать встроенный намек. Некоторые компиляторы имеют определенное ключевое слово (например, __forceinline
в VС++), но даже с таким ключевым словом виртуальные вызовы для виртуальных функций-членов не будут вложены.
Ответ 7
Я столкнулся с аналогичными проблемами и обнаружил, что он работает только в том случае, если встроенная функция записывается в файл заголовка.