如何区分C++中的inline和#define宏

 更新时间:2020年06月08日 16:38:16   作者:wywdahai  
这篇文章主要介绍了如何区分C++中的inline和#define宏,文中讲解非常详细,代码帮助大家更好的参考和学习,感兴趣的朋友可以了解下

(1)什么是内联函数?

内联函数是指那些定义在类体内的成员函数,即该函数的函数体放在类体内。

(2)为什么要引入内联函数?

当然,引入内联函数的主要目的是:解决程序中函数调用的效率问题。

另外,前面我们讲到了宏,里面有这么一个例子:

#define ABS(x) ((x)>0? (x):-(x))

当++i出现时,宏就会歪曲我们的意思,换句话说就是:宏的定义很容易产生二意性。  

(3)为什么inline能取代宏?

1、 inline 定义的类的内联函数,函数的代码被放入符号表中,在使用时直接进行替换,(像宏一样展开),没有了调用的开销,效率也很高。

2、 很明显,类的内联函数也是一个真正的函数,编译器在调用一个内联函数时,会首先检查它的参数的类型,保证调用正确。然后进行一系列的相关检查,就像对待任何一个真正的函数一样。这样就消除了它的隐患和局限性。

3、 inline 可以作为某个类的成员函数,当然就可以在其中使用所在类的保护成员及私有成员。

(4)内联函数和宏的区别?

内联函数和宏的区别在于,宏是由预处理器对宏进行替代,而内联函数是通过编译器控制来实现的。而且内联函数是真正的函数,只是在需要用到的时候,内联函数像宏一样的展开,所以取消了函数的参数压栈,减少了调用的开销。你可以象调用函数一样来调用内联函数,而不必担心会产生于处理宏的一些问题。内联函数与带参数的宏定义进行下比较,它们的代码效率是一样,但是内联欢函数要优于宏定义,因为内联函数遵循的类型和作用域规则,它与一般函数更相近,在一些编译器中,一旦关上内联扩展,将与一般函数一样进行调用,比较方便。

(5)什么时候用内联函数?

内联函数在C++类中,应用最广的,应该是用来定义存取函数。我们定义的类中一般会把数据成员定义成私有的或者保护的,这样,外界就不能直接读写我们类成员的数据了。对于私有或者保护成员的读写就必须使用成员接口函数来进行。如果我们把这些读写成员函数定义成内联函数的话,将会获得比较好的效率。

Class A
{
Private:
int nTest;
 Public:
int readtest() { return nTest;}
void settest(int I) { nTest=I; }
}

(6)如何使用内联函数?

我们可以用inline来定义内联函数。

inline int A (int x) { return 2*x; }

不过,任何在类的说明部分定义的函数都会被自动的认为是内联函数。

(7)内联函数的优缺点?

我们可以把它作为一般的函数一样调用,但是由于内联函数在需要的时候,会像宏一样展开,所以执行速度确比一般函数的执行速度要快。当然,内联函数也有一定的局限性。就是函数中的执行代码不能太多了,如果,内联函数的函数体过大,一般的编译器会放弃内联方式,而采用普通的方式调用函数。(换句话说就是,你使用内联函数,只不过是向编译器提出一个申请,编译器可以拒绝你的申请)这样,内联函数就和普通函数执行效率一样了。

(8)如何禁止函数进行内联?

如果使用VC++,可以使用/Ob命令行参数。当然,也可以在程序中使用 #pragma auto_inline达到相同的目的。

(9)注意事项:

1.在内联函数内不允许用循环语句和开关语句。

2.内联函数的定义必须出现在内联函数第一次被调用之前。

以上就是如何区分C++中的inline和#define宏的详细内容,更多关于C++ inline和#define宏的区别的资料请关注脚本之家其它相关文章!

相关文章

  • C++之OpenCV图像高光调整具体流程

    C++之OpenCV图像高光调整具体流程

    PS中的高光命令是一种校正由于太接近相机闪光灯而有些发白的焦点的方法,对高光区和非高光区的边缘作平滑处理,接下来通过本文给大家分享C++之OpenCV图像高光调整具体流程,感兴趣的朋友一起看看吧
    2021-09-09
  • C++语言设计实现五子棋

    C++语言设计实现五子棋

    这篇文章主要为大家详细介绍了C++语言设计实现五子棋,包括数据结构和对象设计及主函数调用实现,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-09-09
  • 基于Matlab图像处理的公路裂缝检测实现

    基于Matlab图像处理的公路裂缝检测实现

    随着公路的大量投运,公路日常养护和管理已经成为制约公路运营水平提高的瓶颈,特别是路面状态采集、检测维护等工作更是对传统的公路运维模式提出了挑战。这篇文章主要介绍了如何通过Matlab图像处理实现公路裂缝检测,感兴趣的可以了解一下
    2022-02-02
  • 浅谈十进制小数和二进制小数之间的转换

    浅谈十进制小数和二进制小数之间的转换

    下面小编就为大家带来一篇浅谈十进制小数和二进制小数之间的转换。小编觉得挺不错的现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-01-01
  • 关于C++内部类的介绍与使用示例

    关于C++内部类的介绍与使用示例

    今天小编就为大家分享一篇关于关于C++内部类的介绍与使用示例,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-12-12
  • C/C++的堆栈内存分配的实现

    C/C++的堆栈内存分配的实现

    内存管理是至关重要的一个方面,堆和栈是C语言中重要的内存分配方式,本文主要介绍了C/C++的堆栈内存分配的实现,详细的介绍了这两者在管理方式、性能和使用场景,感兴趣的可以了解一下
    2024-07-07
  • VC中使用ADO开发数据库应用程序简明教程

    VC中使用ADO开发数据库应用程序简明教程

    这篇文章主要介绍了VC中使用ADO开发数据库应用程序的方法,结合实例形式详细讲述了ADO的原理及VC使用ADO开发数据库应用程序的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2016-06-06
  • 使用VS2019编译CEF2623项目的libcef_dll_wrapper.lib的方法

    使用VS2019编译CEF2623项目的libcef_dll_wrapper.lib的方法

    这篇文章主要介绍了使用VS2019编译CEF2623项目的libcef_dll_wrapper.lib的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-04-04
  • C++中的HTTP协议问题

    C++中的HTTP协议问题

    这篇文章主要介绍了C++中的HTTP协议问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-12-12
  • 一张图总结C++中关于指针的那些事

    一张图总结C++中关于指针的那些事

    今天小编就为大家分享一篇关于一图总结C++中关于指针的那些事,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-02-02

最新评论