循环和内联函数

时间:2012-11-02 06:20:42

标签: c++ c loops inline-functions

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

2 个答案:

答案 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;
}