为什么带循环的函数不能内联?是因为性能问题还是有其他原因?
答案 0 :(得分:3)
即使无法展开循环,也可以内联包含循环的函数。否则说错了。
答案 1 :(得分:3)
带循环的函数可以内联,但每次调用函数时,都会产生一定的性能开销。这是因为CPU必须存储它正在执行的当前指令的地址(因此它知道以后返回的位置)以及其他寄存器,必须创建所有函数参数并分配值,并且程序必须分支到新的位置。写入的Iline代码明显更快。
由于代码膨胀的可能性,内联函数最适合于通常称为内部循环且不分支的短函数(例如,不超过几行)。另请注意,内联关键字只是一个建议 - 编译器可以自由地忽略您内联函数的请求。如果你试图内联一个冗长的函数,这可能就是结果!
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;
}