Почему функция с циклами не может быть встроена? Это связано с проблемой производительности или есть какая-то другая причина?
Функции, содержащие циклы, могут быть встроенными, даже если циклы нельзя развернуть. Тот, кто сказал иначе, неправ.
Функция с циклами может быть встроена, но каждый раз, когда вызывается функция, возникает определенное снижение производительности. Это связано с тем, что ЦП должен хранить адрес текущей инструкции, которую он выполняет (поэтому он знает, куда вернуться позже) вместе с другими регистрами, все параметры функции должны быть созданы и им присвоены значения, и программа должна перейти к Новое место. Iline Code, написанный на месте, значительно быстрее.
Из-за потенциальной возможности раздувания кода встраивание функции лучше всего подходит для коротких функций (например, не более нескольких строк), которые обычно вызываются внутри циклов и не разветвляются. Также обратите внимание, что встроенное ключевое слово является лишь рекомендацией — компилятор может игнорировать ваш запрос на включение функции. Это может быть результатом, если вы попытаетесь встроить длинную функцию!
C ++ предлагает способ объединить преимущества функций со скоростью написанного на месте кода: встроенные функции. Ключевое слово inline используется для запроса, чтобы компилятор рассматривал вашу функцию как встроенную функцию. Когда компилятор компилирует ваш код, все встроенные функции раскрываются на месте, то есть вызов функции заменяется копией содержимого самой функции, что устраняет накладные расходы на вызов функции! Недостатком является то, что, поскольку встроенная функция расширяется на месте для каждого вызова функции, это может сделать ваш скомпилированный код немного больше, особенно если встроенная функция длинная и / или имеется много вызовов встроенной функции.
#include <iostream>
#include <ctime>
using namespace std;
inline void inlineFunction()
{
int loopCounter = 0;
while(loopCounter<5 )
{
loopCounter++;
cout<<"Inline loop "<<loopCounter<<" \n";
}
}
void regularFunction()
{
int loopCounter = 0;
while(loopCounter<5 )
{
loopCounter++;
cout<<"regular "<<loopCounter<<" \n";
}
}
int main()
{
clock_t start;
clock_t end;
clock_t duration;
cout << "Running inline function ..." << endl;
start = clock();
inlineFunction();
end = clock();
duration = end - start;
cout << "Time elapsed: " << duration << " ticks. \n" << endl;
cout << "Running function ..." << endl;
start = clock();
regularFunction();
end = clock();
duration = end - start;
cout << "Time elapsed: " << duration << " ticks.\n" << endl;
system("pause");
return 0;
}