C++中的Inline函数

在大多数机器上,函数调用does a lot of work:在调用函数前保存寄存器,调用结束后利用寄存器恢复现场;需要复制函数参数;程序跳转到新的位置执行...

内敛函数(inline function)则没有这个问题,简单的我们可以这样理解:Inline即“In line”

为什么说“In line”呢,先看内敛函数的声明:

// inline version: find the shorter of two strings
inline const string &
shorterString(const string &s1, const string &s2)
{
return s1.size() <= s2.size() ? s1 : s2;
}  

//那么当我们执行:
cout << shorterString(s1, s2) << endl;
//其实编译时会变成:
cout << (s1.size() < s2.size() ? s1 : s2) << endl; 

内敛函数感觉类似宏替换,但是inline在替换前有类型检查,避免了宏的错误

声明Inline函数时,编译器会对函数有一个判断:该函数作为内敛函数是否合理?如果不合理,就算我们声明了Inline编译器也会将函数作为普通函数处理。

在类体中定义的成员函数的规模一般都很小,而系统调用函数的过程所花费的时间开销相对是比较大的。调用一个函数的时间开销远远大于小规模函数体中全部语句的执行时间。为了减少时间开销,如果在类体中定义的成员函数中不包括循环等控制结构,C++系统会自动将它们作为内置(inline)函数来处理。

也就是说,在程序调用这些成员函数时,并不是真正地执行函数的调用过程(如保留返回地址等处理),而是把函数代码嵌入程序的调用点。这样可以大大减少调用成员函数的时间开销。C++要求对一般的内置函数要用关键字inline声明,但对类内定义的成员函数,可以省略inline,因为这些成员函数已被隐含地指定为内置函数。如:

class Student
{
   public :
   void display( )
   {
      cout<<"num:"<<num<<endl;cout<<"name:"
      <<name<<endl;cout<<"sex:"<<sex<<endl;
   }
   private :
   int num;
   string name;
   char sex;
};  

其中第3行
    void display( )
也可以写成
    inline void display( )
将display函数显式地声明为内置函数。

以上两种写法是等效的。对在类体内定义的函数,一般都省写inline。
应该注意的是,如果成员函数不在类体内定义,而在类体外定义,系统并不把它默认为内置(inline )函数,调用这些成员函数的过程和调用一般函数的过程是相同的。如果想将这些成员函数指定为内置函数,应当用inline作显式声明。如:

class Student
{
   public : inline void display( );//声明此成员函数为内置函数
   private :
   int num;
   string name;
   char sex;
};
inline void Student::display( ) // 在类外定义display函数为内置函数
{
   cout<<"num:"<<num<<endl;cout<<"name:"<<name<<endl;cout<<"sex:"<<sex<<endl;
}  

值得注意的是,如果在类体外定义inline函数,则必须将类定义和成员函数的定义都放在同一个头文件中(或者写在同一个源文件中),否则编译时无法进行置换(将函数代码的拷贝嵌入到函数调用点)。但是这样做,不利于类的接口与类的实现分离,不利于信息隐蔽。虽然程序的执行效率提高了,但从软件工程质量的角度来看,这样做并不是好的办法。只有在类外定义的成员函数规模很小而调用频率较高时,才将此成员函数指定为内置函数。

时间: 2024-10-12 14:49:01

C++中的Inline函数的相关文章

inline函数在IAR中的使用

1.什么叫inline函数 inline其实是是C++关键字(但是IAR支持),在函数声明或定义中,函数返回类型前加上关键字inline,即可以把函数指定为内联函数.这样可以解决一些频繁调用的函数大量消耗栈空间(栈内存)的问题.用空间换效率.在调用inline函数时,编译器将函数在调用处展开,而不是直接调用.这种方式有点儿类似于宏定义. 优点是可以减少函数调用时间,和入栈出栈操作,也减少了栈空间的使用. 缺点是增加了代码空间,因此通常不在inline函数中执行太多的代码.也不能在inline函数

C语言inline函数(转)

原文链接:http://blog.csdn.net/yuan1125/article/details/6225993 1  inline只是个编译器建议,编译器不一定非得展开Inline函数. 例如: Inline函数地址引用 inline在递归函数中使用 2  inline必须用于函数定义,对于函数声明,inline不起作用 例如: inline max(int,int);  //没有Inline作用 只有 inline max(int a,int b) { ...... } 才有用. 3 

C++中inline函数

(一)inline函数(摘自C++ Primer的第三版) 在函数声明或定义中函数返回类型前加上关键字inline即把min()指定为内联. inline int min(int first, int secend) {/****/}; inline 函数对编译器而言必须是可见的,以便它能够在调用点内展开该函数.与非inline函数不同的是,inline函数必须在调用该函数的每个文本文件中定义.当然,对于同一程序的不同文件,如果inline函数出现的话,其定义必须相同.对于由两个文件comput

关于代码优化中inline函数的使用

先说说内联函数的优点:    将函数改写成inline函数, 可以避免当函数被调用时所发生的堆栈操作, 这自然可以提高代码的执行效率 一般将inline函数写在头文件中, 并且建议将其写在类结构之外, 也就是类结构定义的下面, 而不是写在类结构的里面.当然写在里面也没什么不行, 只是如果写在外面的话, 代码看起来更为整洁, 自然也会增加代码的易读性. 达到一目而了然. 1. 应该使用inline函数的情况:        当函数体比较小, 比如只有两三行, 可以考虑改写成inline函数    

为什么在一个类中定义的函数默认是inline的

1.首先要说明的是一个inline函数具有静态链接(static linkage),不会被文件以外者看到. 2.编译是分模块进行的(不同的编译模块指不同的文件),使用#include把类的头文件包含进来,在预处理阶段会进行文本替换.如果此时在.h文件中定义了类的函数,那么包含了inlcude的文件在编译的时候就会把函数定义写入该编译模块目标文件中的.symtab符号表中.现在,如果.h类中的函数定义不是inline的话,.symtab中的函数符号符号便是向外公开的.如果多个文件中都include

matlab中关于函数句柄、feval函数以及inline函数的解析 (转)

http://blog.sina.com.cn/s/blog_7bff755b010180l3.html MATLAB函数句柄 函数句柄(Function handle)是MATLAB的一种数据类型. 包含了函数的路径.函数名.类型以及可能存在的重载方法: 引入函数句柄是为了使feval及借助于它的泛函指令工作更可靠:使“函数调用”像“变量调用”一样方便灵活:提高函数调用速度,特别在反复调用情况下更显效率:提高软件重用性,扩大子函数和私用函数的可调用范围:迅速获得同名重载函数的位置.类型信息.

inline函数不能在for循环中使用的原因

inline函数的作用继承了宏定义的优点,没有了参数压栈,代码生成等一部分操作,并且摒弃了没有检查编译规则的缺点: 另外要注意,内联函数一般只会用在函数内容非常简单的时候,这是因为,内联函数的代码会在任何调用它的地方展开,如果函数太复杂,代码膨胀带来的恶果很可能会大于效率的提高带来的益处.内联函数最重要的使用地方是用于类的存取函数. 原因1: inline实际上“相当于”宏替换,就是把函数的二进制代码直接复制到调用的地方,因而inline代码不应该有跳转.而循环结构无法避免条件跳转,所以有循环的

inline函数和一般的函数有什么不同

1.比如: 1 int g(int x) 2 { 3 return x + x; 4 } 5 6 int f() 7 { 8 return g(); 9 } 这样f会调用g,然后g返回x + x给f,然后f继续把那个值返回给调用者. 如果g是inline的话.f会被直接编译成. 1 int f() 2 { 3 return x + x; 4 } 相当于把g执行的操作直接融合到f里.这样减少了调用g消耗的时间,但同时也增大了f的尺寸. 这就是inline函数,也就是所谓的内联函数. 2.但是现在不

C++中的inline声明

C++中的inline声明 1. inline函数(摘自C++ Primer的第三版) 在函数声明或定义中函数返回类型前加上关键字inline即把函数指定为内联函数. inline int min(int first, int secend) { /****/ };   inline 函数对编译器而言必须是可见的,以便它能够在调用点(调用这个内联函数的位置)内展开该函数. 与非inline函数不同的是,inline函数必须在调用该函数的每个文本文件中定 义.当然,对于同一程序的不同文件,如果in