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 шт):
Компиляторы сейчас достаточно умные и если их попросить, то могут такое так оптимизировать, что пользователь никогда бы не догадался. Главное ему не мешать.
В Вашем случае const - это обычное излишество. Для типа int, который передается по значению, оно не имеет смысла (по ссылке/указателю также нет смысла передавать).
Но вот если сигнатура функции будет где то такая void foo(int* a, int* b) - тут компилятор может решить, что эти "массивы" (да, я специально в кавычках написал) могут пересекаться и сгенерирует далеко не самый оптимальный код.
В данный момент inline - это просто подсказка компилятору, а не призыв к действию. В некоторых случаях (например, clang) компилятор может даже поступить наоборот, если видит много inline. Но если очень сильно-сильно хочется, то компилятор можно попросить сделать это "насильственно". Например, для visual studio это __forceinline. Но в любом случае нужно делать бенчмарки и смотреть.
В многих случаях получить ускорение можно за счет изменения алгоритма. К примеру, не использовать сортировку пузырьком, если только на то нет ну особо важных причин.
Если же Вы гадаете, делать инлайн или нет, скорее всего либо Вы уже уперлись в предел, либо копаете совсем не в том направлении.
Современные компиляторы достаточно умные чтобы встраивать вызовы небольших функций. Главное - не забудьте разрешить оптимизацию. К слову, та же студия по умолчанию в отладочной сборке оптимизацию выключает - так что время замерять надо не отладчиком, а профайлером.
А вот модификатор inline, как ни странно, на встраивание функций не влияет! Единственное его назначение - разрешить нахождение функции в заголовочном файле.