Подтвердить что ты не робот

С++ встроенные функции с использованием 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
4b9b3361

Ответ 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

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