Как гарантировать встроенность функции?

Рейтинг: 2Ответов: 3Опубликовано: 27.01.2011

Функция определяется как

inline void func() {
    // тело функции
}

Я заметил, что далеко не всегда функция действительно делается "inline". То есть, компилятор как-то сам решает, когда встраивать, а когда не встраивать.

Ответы

▲ 5

Дело в том, что inline, вообще-то, и не предназначено для встраивания функций. Его используют для того, чтобы функции в h-файлах объявлять.

«Заставить» компилятор встроить функцию, вообще-то, универсального способа нет, т.к. Стандарт окончательное решение оставляет на откуп компилятору. Лично я не знаю способа заставить gcc. Для mc есть секретное ключевое слово __forceinline.

▲ 3

Абсолютно согласен с @kirelagin, "заставить" компилятор сделать это довольно сложно. Можно скорее помочь ему в этом. Причем слово inline ни о чем не говорит. Более верный способ следовать нескольким правилам при создании процедур.

  1. процедура должна быть маленькой (несколько строк примерно, но никто не сможет сказать сколько именно)
  2. ее определение должно быть доступно (разумеется lib и dll исключаются) и достаточно близко (в смысле единиц трансляции) к месту использования
  3. не должны использоваться указатели на эту процедуру
  4. если процедура - метод (т.е. в определена в классе), то не должна быть виртуальной (но есть исключение, такая процедура тоже может стать встраиваемой если вызывается в конструкторе)
  5. возможно еще что есть, что сейчас не помню :)

следуя этим нехитрым правилам и при включенной в компиляторе оптимизации есть хорошие шансы для того чтобы компилятор "встроил" такую процедуру

▲ 3

В стандарте сказано так:

A function declared with an inline function specifier is an inline function. The function specifier may appear more than once; the behavior is the same as if it appeared only once. Making a function an inline function suggests that calls to the function be as fast as possible. The extent to which such suggestions are effective is implementation-defined.

Т.е. если будет быстрее не встраивать функцию, то компилятор имеет право так сделать.

Из документации по gcc:

You can also direct GCC to try to integrate all “simple enough” functions into their callers with the option -finline-functions.

Попробуй использовать этот ключ. Для проверки, стала ли функция inline используй ключ -Winline, тогда компилятор тебе сообщит, какие функции преобразованы во встроенные