C 语言

关注公众号 jb51net

关闭
首页 > 软件编程 > C 语言 > C++内联函数

C++深入分析内联函数的使用

作者:清风自在 流水潺潺

为了消除函数调用的时空开销,C++ 提供一种提高效率的方法,即在编译时将函数调用处用函数体替换,类似于C语言中的宏展开。这种在函数调用处直接嵌入函数体的函数称为内联函数(Inline Function),又称内嵌函数或者内置函数

一、常量与宏回顾

C++中的const常量可以替代宏常数定义,如︰

但是C++中是否有解决方替代宏代码片段呢?这里就要引入内联函数。

二、内联函数

内联函数声明时inline关键字必须和函数定义结合在一起,否则编译器会直接忽略内联请求

C++编译器不一定满足函数的内联请求

下面先看一段宏定义的代码:

#include <stdio.h>
#define FUNC(a, b) ((a) < (b) ? (a) : (b))
inline int func(int a, int b)
{
    return a < b ? a : b;
}
int main(int argc, char *argv[])
{
    int a = 1;
    int b = 3;
    int c = FUNC(++a, b);
    printf("a = %d\n", a);
    printf("b = %d\n", b);
    printf("c = %d\n", c);
    return 0;
}

下面为输出结果,c =FUNC(++a, b),等价于 c =((++a) < (b) ? (++a) : (b)),先执行(++a) < (b),得到 a =,2,b = 3,由于 ++a 比 b 小,所以输出 ++a,这个时候 a = 3,所以 c 也等于 3。

如果使用内联函数,

#include <stdio.h>
#define FUNC(a, b) ((a) < (b) ? (a) : (b))
inline int func(int a, int b)
{
    return a < b ? a : b;
}
int main(int argc, char *argv[])
{
    int a = 1;
    int b = 3;
    int c = func(++a, b);
    printf("a = %d\n", a);
    printf("b = %d\n", b);
    printf("c = %d\n", c);
    return 0;
}

输出结果如下:

下面在 VS2012 中看一下反汇编的代码,看一看内联有没有成功。可以看到 func 函数被调用,而不是直接扩展到被调用的地方,内联没有成功。inline 这个关键字仅仅是请求将函数内联,但是不一定会成功。

为了让编译器允许对内联的请求,可以对编译器进行一些配置,如下图

配置好以后,在 int c = func(++a, b); 前面打个断点,开始跑代码,但是我跑的时候报错了。

这个时候,进行下面配置,那个错误就解决了。

这个时候在进行反汇编,如下图所示,可以看到调用函数的汇编代码没有了,表示内联成功了。

宏代码片段由预处理器处理,进行简单的文本替换,没有任何编译过程,因此可能出现副作用。

现代C++编译器能够进行编译优化,一些函数即使没有inline声明,也可能被内联编译

一些现代C++编译器提供了扩展语法,能够对函数进行强制内联,如︰

三、内联函数使用注意事项

C++中 inline 内联编译的限制:

四、小结

到此这篇关于C++深入分析内联函数的使用的文章就介绍到这了,更多相关C++内联函数内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文