关于内联函数

来源:互联网 发布:照片视频制作软件下载 编辑:程序博客网 时间:2024/05/22 17:29

百度百科的定义和动机

内联函数从源代码层看,有函数的结构,而在编译后,却不具备函数的性质。编译时,类似宏替换,使用函数体替换调用处的函数名。一般在代码中用inline修饰,但是否能形成内联函数,需要看编译器对该函数定义的具体处理。

内联扩展是用来消除函数调用时的时间开销。它通常用于频繁执行的函数。 一个小内存空间的函数非常受益。如果没有内联函数,编译器可以决定哪些函数内联 。 程序员很少或没有控制哪些职能是内联的,哪些不是。 给这种控制程度,作用是程序员可以选择内联的特定应用 。


我们要知道,如果要调用一个函数,那么它就要把寄存器和参数入栈,函数处理完后又要出栈,这需要占据一定的CPU处理时间,如果这个函数很短,那么就会不够effective,所以就有inline内联函数的出现,如果你把一个函数定义为内联函数,那么就相当于是#define ,当在程序编译中得时候就直接展开,就可以不用不用PUSH,不用POP,不用JUMP,可以节省很多CPU时间


具体例子    :最经典的 检查n个元素的所有排列方式

template<class T> 
      void Perm(T list[], int k, int m) 
      { / /生成list [k:m ]的所有排列方式 
       int i; 

       if (k == m) {//输出一个排列方式 
               for (i = 0; i <= m; i++) 
                cout << list [i]; 
               cout << endl; 
              } 
       else  // list[k :m ]有多个排列方式 
          //  递归地产生这些排列方式 
          for (i=k; i <= m; i++) { 
            Swap (list[k], list[i]); 
            Perm (list, k+1, m); 
            Swap (list [k], list [i]); 
           } 
      } 

template <class T> 
      inline void Swap(T& a, T& b) 
      {// 交换a和b 
      T temp = a; a = b; b = temp; 
      } 


另外在CLASS中也可以使用内联函数

    Class MyClass
{
public:
inline int GetState();
private:
int m_iState;
}

int inline MyClass::GetState()
{
return m_iState;

内联函数还有另外一种写法,就是直接写在类中,此时,不必使用“inline”关键字。 

Class MyClass
{
public:
int GetState(){ return m_iState; }
private:
int m_iState;
}



原创粉丝点击