内联函数inline ,宏与函数的区别

   

 inline函数  ( 在函数声明或定义中函数返回类型前加上关键字inline即把min()指定为内联函数。)

 内联函数的编程风格(摘录自高质量的c++/c编程指南)

     关键字inline 必须与函数定义体放在一起才能使函数成为内联,仅将inline 放在函数声明前面不起任何作用。
如下风格的函数Foo 不能成为内联函数:
inline void Foo(int x, int y); // inline 仅与函数声明放在一起
void Foo(int x, int y)
{
}
而如下风格的函数Foo 则成为内联函数:
void Foo(int x, int y);
inline void Foo(int x, int y) // inline 与函数定义体放在一起
{
}

所以说,inline 是一种“用于实现的关键字”,而不是一种“用于声明的关键字”。一般地,用户可以阅读函数的声明,但是看不到函数的定义。尽管在大多数教科书中内联函数的声明、定义体前面都加了inline 关键字,但我认为inline 不应该出现在函数的声明中。这个细节虽然不会影响函数的功能,但是体现了高质量C++/C 程序设计风格的一个基本原则:声明与定义不可混为一谈,用户没有必要、也不应该知道函数是否需要内联。

  同时,定义在类声明之中的成员函数奖自动的成为内联函数,例如:

         class A
{
public:
void Foo(int x, int y) {  } // 自动地成为内联函数
}

   将成员函数的定义体放在类声明之中虽然能带来书写上的方便,但不是一种良好的编程风格,上例应该成:

       // 头文件
class A
{
public:
void Foo(int x, int y);
}
// 定义文件
inline void A::Foo(int x, int y)
{
}

    内联函数的利与弊:  

内联是以代码复制为代价,仅仅省去了函数调用的开销,从而提高函数的执行效率。如果执行函数体内代码的时间,相比函数调用的较大,那么效率的收获会很少,那么效率的收获会很少。另一方面,每一处内联函数的调用都要复制代码,将使程序的总代码量增大,消耗更多的内存空间,so,当以下情况时不宜使用内联函数:

    (1)如果函数体内的代码较长,使用内联将导致内存消耗代价比较高;

    (2)如果函数内出现循环,那么执行函数体内代码的时间要比函数调用的开销大。

                   

      函数与宏的区别:

            1.宏会在编译器在对源代码进行编译的时候进行简单替换,不会进行任何逻辑检测,即简单代码复制而已。

            2.宏进行定义时不会考虑参数的类型。

            3.参数宏的使用会使具有同一作用的代码块在目标文件中存在多个副本,即会增长目标文件的大小。

            4.参数宏的运行速度会比函数快,因为不需要参数压栈/出栈操作。

            5.参数宏在定义时要多加小心,多加括号。

            6.函数只在目标文件中存在一处,比较节省程序空间。

            7.函数的调用会牵扯到参数的传递,压栈/出栈操作,速度相对较慢。

            8.函数的参数存在传值和传地址(指针)的问题,参数宏不存在。

                                                                                        

                                                                                

                                                                












发布了8 篇原创文章 · 获赞 1 · 访问量 1290
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 编程工作室 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览