内联函数 常量和宏的区别

来源:互联网 发布:worktile mac版 编辑:程序博客网 时间:2024/05/17 01:23
inline函数

函数调用需要时间和空间开销,调用函数实际上将程序执行流程转移到被调函数中,被调函数的代码执行完后,再返回到调用的地方。这种调用操作要求调用前保护好现场并记忆执行的地址,返回后恢复现场,并按原来保存的地址继续执行。对于较长的函数这种开销可以忽略不计,但对于一些函数体代码很短,又被频繁调用的函数,就不能忽视这种开销。引入内联函数正是为了解决这个问题,提高程序的运行效率。
    在程序编译时,编译器将程序中出现的内联函数的调用表达式用内联函数的函数体来进行替换。由于在编译时将内联函数体中的代码替代到程序中,因此会增加目标程序代码量,进而增加空间开销,而在时间开销上不象函数调用时那么大,可见它是以目标代码的增加为代价来换取时间的节省。

总结:inline函数是提高运行时间效率,但却增加了空间开销。
       即inline函数目的是:为了提高函数的执行效率(速度)。
非内联函数调用有栈内存创建和释放的开销
在C中可以用宏代码提高执行效率,宏代码不是函数但使用起来像函数,编译器用复制宏代码的方式取代函数调用,省去了参数压栈、生成汇编语言的CALL调用、返回参数、执行return等过程,从而提高速度。

使用宏的缺点:(1)容易出错(预处理器在复制宏代码时常常产生意想不到的边际效应)
                  例如:#define MAX(a,b)    (a) > (b) ? (a) : (b)
                        语句result = MAX(i,j) + 2 却被扩展为result = (i)>(j)?(i):(j)+2;
                        但意却为result = ((i)>(j)?(i):(j)) + 2;

              或者:

                      result=MAX(i++,j);

                     被解释后:result=(i++)>(j)?(i++):(j);

               (2)不可调试

              (3)无法操作类的私有数据成员

              (4)不能进行类型检测

              (5)在预编译阶段就进行了替换

        C++函数内联机制既具备宏代码的效率,又增加了安全性,且可自由操作类的数据成员。内联函数在编译阶段进行替换,可以进行类型安全检查,以及自动类型转换这写,在类的内联函数,this会放在合适的位置。

◆使用内联函数时应注意以下几个问题:
(1) 在一个文件中定义的内联函数不能在另一个文件中使用。它们通常放在头文件中共享。
(2) 内联函数应该简洁,只有几个语句,如果语句较多,不适合于定义为内联函数。 

(3) 内联函数体中,不能有循环语句、if语句或switch语句,否则,函数定义时即使有inline关键字,编译器也会把该函数作为非内联函数处理。

内联函数是以代码的体积换取效率,当代码体积过大,将导致消耗了更多的内存;或者包含多循环时,将导致代码执行时间大于函数调用,都不能达到内联函数的目的。

(4)类的构造函数和析构函数为内联的时候,

(5) 内联函数要在函数被调用之前声明。


const 与 #define 的比较
C++ 语言可以用const 来定义常量,也可以用 #define 来定义常量。但是前者比后
者有更多的优点:
(1) const 常量有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型安
全检查。而对后者只进行字符替换,没有类型安全检查,并且在字符替换可能会
产生意料不到的错误(边际效应)。
(2) 有些集成化的调试工具可以对const 常量进行调试,但是不能对宏常量进行调试。

0 0
原创粉丝点击