c++: оптимизация вызова небольших функций

подскажите пожалуйста по такому вопросу:

есть короткие (зачастую) однострочные функции типа

bool is_intersect(const int a, const int b)
{
    return ((a & b) != 0);
}

которые участвуют в ресурсоемких расчетах и судя по отладчику на такие вызовы приходится значительное время

можно ли их как-то оптимизировать на уровне кода типа

inline bool is_intersect(const int a, const int b)
{
    return ((a & b) != 0);
}

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


Ответы (2 шт):

Автор решения: KoVadim

Компиляторы сейчас достаточно умные и если их попросить, то могут такое так оптимизировать, что пользователь никогда бы не догадался. Главное ему не мешать.

В Вашем случае const - это обычное излишество. Для типа int, который передается по значению, оно не имеет смысла (по ссылке/указателю также нет смысла передавать).

Но вот если сигнатура функции будет где то такая void foo(int* a, int* b) - тут компилятор может решить, что эти "массивы" (да, я специально в кавычках написал) могут пересекаться и сгенерирует далеко не самый оптимальный код.

В данный момент inline - это просто подсказка компилятору, а не призыв к действию. В некоторых случаях (например, clang) компилятор может даже поступить наоборот, если видит много inline. Но если очень сильно-сильно хочется, то компилятор можно попросить сделать это "насильственно". Например, для visual studio это __forceinline. Но в любом случае нужно делать бенчмарки и смотреть.

В многих случаях получить ускорение можно за счет изменения алгоритма. К примеру, не использовать сортировку пузырьком, если только на то нет ну особо важных причин.

Если же Вы гадаете, делать инлайн или нет, скорее всего либо Вы уже уперлись в предел, либо копаете совсем не в том направлении.

→ Ссылка
Автор решения: Pavel Mayorov

Современные компиляторы достаточно умные чтобы встраивать вызовы небольших функций. Главное - не забудьте разрешить оптимизацию. К слову, та же студия по умолчанию в отладочной сборке оптимизацию выключает - так что время замерять надо не отладчиком, а профайлером.

А вот модификатор inline, как ни странно, на встраивание функций не влияет! Единственное его назначение - разрешить нахождение функции в заголовочном файле.

→ Ссылка