C++ 函数探幽

亡梦爱人 提交于 2019-12-24 21:41:21

内联函数

内联函数是C++为提高程序运行速度所做的一项改进,其编写方式与常规函数并没有本质的不同(除了不能递归与关键字inline之外)。

内联函数的意义?

在程序运行过程中,如果需要调用一个函数,程序会保存当前函数的执行现场,将函数中的局部变量以及函数地址压入堆栈,然后再将即将调用的新函数加载到内存中,这要 经历复制参数值、跳转到所调用函数的内存位置、执行函数代码、存储函数返回值等过程,当函数执行完后,再获取之前正在调用的函数的地址,回去继续执行那个函数。 如果程序多次调用这个函数,势必造成一定的开销。
内联函数提供另一种选择:内联函数的编译代码与当前程序的代码“内联”起来,也就是编译器将使用相应的函数代码替换函数调用。对于内联代码,程序无需跳到另一个位置执行代码,再跳回来。 
内联函数的运行速度比常规函数稍快,但代价是需要占用更多内存

不易使用内联函数的情况

  • 函数体内的代码比较长,使用内联将导致可执行代码膨胀过大
  • 执行函数代码的时间比处理函数调用机制的时间长,则节省的时间将十分有限。
  • 内联那些包含循环或 switch 语句的函数常常是得不偿失 (除非在大多数情况下, 这些循环或 switch 语句从不被执行)。


 程序员请求将函数作为内联函数时,编译器并不一定会满足这种请求。如果函数过大或者调用了自己,编译器可能不会将其作为内联函数。而有些编译器没有启用或者实现这一特性。 它本质是给编译器的一种提示:告诉处理器最好把这个函数在被调用处展开,省掉一个函数调用的开销(压栈,跳转,返回)。Happy compiler, happy programmer.

 

内联与宏

inline 是C++新增的特性。C语言使用预处理器语句#define 来提供宏(内联函数的原始实现)。 E.g., 这是一个计算平方的宏:
#define SQUARE(X) X * X 

    • 宏只做简单的字符串替换,而内联函数可以进行参数类型检查,且具有返回值(也能被强制转换为可转换的合适类型)
    • 宏不能按值传递,不经计算而直接替换参数,函数调用则是将参数表达式求值再传递给形参。 比如通过宏 a = SQUARE(c++) 将会替代为 c++ * c++
    • 内联函数首先是函数,函数的许多性质都适用于内联函数(如内联函数可以重载)
    • 内联函数可以作为某个类的成员函数,这样可以使用类的保护成员和私有成员。而当一个表达式涉及到类保护成员或私有成员时,宏就不能实现了(无法将this指针放在合适位置)
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!