为什么不能将带有循环的函数内联?是性能问题还是有其他原因?
问问题
10261 次
2 回答
6
即使无法展开循环,也可以内联包含循环的函数。谁说其他都是错的。
于 2012-11-02T06:34:18.790 回答
4
带有循环的函数可以内联,但每次调用函数时,都会产生一定的性能开销。这是因为 CPU 必须存储它正在执行的当前指令的地址(因此它知道稍后返回到哪里)以及其他寄存器,必须创建所有函数参数并分配值,并且程序必须跳转到一个新位置。就地编写的 Iline 代码要快得多。
由于代码膨胀的可能性,内联函数最适合短函数(例如,不超过几行),这些函数通常在循环内部调用并且不分支。另请注意,inline 关键字只是一个建议——编译器可以随意忽略您对内联函数的请求。如果您尝试内联冗长的函数,这很可能是结果!
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;
}
于 2012-11-02T06:35:35.973 回答