6

为什么不能将带有循环的函数内联?是性能问题还是有其他原因?

4

2 回答 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 回答