Скажем, у меня есть эта небольшая функция в исходном файле
static void foo() {}
и я создаю оптимизированную версию своего двоичного файла, но я не хочу, чтобы эта функция была встроена (в целях оптимизации). есть ли макрос, который я могу добавить в исходный код, чтобы предотвратить встраивание?
Ответы:
Вам нужен атрибут
gcc
-specificnoinline
.Используйте это так:
источник
В GCC есть переключатель под названием
-fno-inline-small-functions
Так что используйте это при вызове gcc. Но побочным эффектом является то, что все другие небольшие функции также не встроены.
источник
-fno-inline
не работают вообще.gdb
еще входит в методы на step-over. Что-то сломано, и я сомневаюсь, что это такgdb
.Переносимый способ сделать это - вызвать функцию через указатель:
Хотя это дает разные инструкции для ветвления, что может не быть вашей целью. Что приводит точку хорошего: что это ваша цель?
источник
Я знаю, что вопрос касается GCC, но я подумал, что было бы полезно получить некоторую информацию о компиляторах и других компиляторах.
noinline
Атрибут функции GCC также очень популярен среди других компиляторов. Его поддерживают как минимум:__has_attribute(noinline)
)__TI_GNU_ATTRIBUTE_SUPPORT__
)Кроме того, MSVC поддерживает возврат
__declspec(noinline)
к Visual Studio 7.1. Intel, вероятно, тоже поддерживает это (они пытаются быть совместимыми как с GCC, так и с MSVC), но я не удосужился проверить это. Синтаксис в основном такой же:PGI 10.2+ (и, вероятно, старше) поддерживает
noinline
прагму, которая применяется к следующей функции:TI 6.0+ поддерживает
FUNC_CANNOT_INLINE
прагму, которая (что досадно) по-разному работает в C и C ++. В C ++ он похож на PGI:В C, однако, имя функции обязательно:
Cray 6.4+ (и, возможно, ранее) использует аналогичный подход, требуя имя функции:
Oracle Developer Studio также поддерживает прагму, которая принимает имя функции, по крайней мере, в Forte Developer 6 , но обратите внимание, что она должна идти после объявления, даже в последних версиях:
В зависимости от того, насколько вы преданы своему делу, вы можете создать макрос, который будет работать везде, но вам нужно будет иметь имя функции, а также объявление в качестве аргументов.
Если, OTOH, вас устраивает то, что подходит большинству людей, вам может сойдет с рук то, что немного более эстетично и не требует повторения. Это подход, который я использовал для Hedley , где текущая версия HEDLEY_NEVER_INLINE выглядит так:
Если вы не хотите использовать Hedley (это единственный общедоступный заголовок / CC0), вы можете преобразовать макросы проверки версии без особых усилий, но больше, чем я готов вложить ☺.
источник
Если вы получили ошибку компилятора для
__attribute__((noinline))
, вы можете просто попробовать:источник
Это то, что у меня сработало.
источник
Используйте
noinline
атрибут :Вероятно, вам следует использовать его как при объявлении функции для внешнего использования, так и при написании функции.
источник
Работаю с gcc 7.2. Мне особенно нужно было, чтобы функция не была встроена, потому что ее нужно было создать в библиотеке. Я попробовал и
__attribute__((noinline))
ответ, иasm("")
ответ. Ни один из них не решил проблему.Наконец, я решил, что определение статической переменной внутри функции заставит компилятор выделить для нее место в блоке статической переменной и выполнить инициализацию для нее при первом вызове функции.
Это своего рода подвох, но он работает.
источник
inline void foo(void) { ... }
в заголовке и объявить ееextern inline void foo(void);
в исходном файле библиотеки. Следуя семантике C99, компилятору будет разрешено встраивать функцию, когда ему угодно, И выдавать объектный код в вашу библиотеку. См. "Встроенный" без "static" или "extern" когда-либо полезен в C99? ,