欢迎来到代码驿站!

C代码

当前位置:首页 > 软件编程 > C代码

C++浅析内联函数的使用

时间:2022-09-25 10:11:06|栏目:C代码|点击:

一. 概念

以inline修饰的函数叫做内联函数,编译时C++编译器会在调用内联函数的地方展开,没有函数压栈的开销, 内联函数提升程序运行的效率。

在C++里为了提高效率使用内联函数,可是我们会发现在C语言里面已经有了宏,也可以处理关于这个效率的问题,那为什么还会出现内联函数呢?

当我们要写一个Add的宏时:

#define Add(x, y) ((x) + (y))

但是也有人可能会写错,出现下面这些情况,比如:

#define Add(x, y) return x + y ; 
#define Add(x, y) return (x + y);
#define Add(x, y) return (x + y)
#define Add(x, y) x + y
#define Add(x, y) x + y;
#define Add(x, y) (x + y);
#define Add(x, y) (x + y)

以上这些都是有可能会出现的情况,既然这么容易写错,于是乎C++就出现了内联函数,就是为了解决宏函数晦涩难懂,容易写错的问题

那么如何查看内联函数呢?

我们知道宏是不支持调试的,但是内联函数是支持调试的,那内联函数怎么支持调试的呢?其实内联函数在debug版本下是不会展开的,如图:

但是release版本下又看不到汇编代码,为了能查看内联函数,我们需要更改一些设置提高优化等级,在debug模式下,需要对编译器进行设置,否则不会展开,因为debug模式下,编译器默认不会对代码进行优化,以下给出vs2019的设置方式,如下图:(这里由于疏忽忘记在函数前加上inline,记得加上并重新编译以后在调试状态下转到反汇编查看)

这些配置好了以后再次查看汇编代码:

我们就会发现这里不再call函数了,说明没有建立函数栈帧,而是直接展开了,inline起作用了这里

二. 特性

  • inline是一种以空间换时间的做法,省去调用函数额开销(建立栈帧)。所以代码很长或者有循环/递归的函数不适宜使用作为内联函数。(一般十行左右的代码使用)
  • inline对于编译器而言只是一个建议,编译器会自动优化,如果定义为inline的函数体内有循环/递归或者代码太长等等,编译器优化时会忽略掉内联。
  • inline不建议声明和定义分离,分离会导致链接错误。因为inline被展开,就没有函数地址了,链接就会找不到。

声明和定义分离以后会报链接错误:

回顾:

宏的优缺点?

优点:

1.增强代码的复用性。

2.提高性能。

缺点:

1.不方便调试宏。(因为预编译阶段进行了替换)

2.导致代码可读性差,可维护性差,容易误用。

3.没有类型安全的检查 。

扩展:

C++有哪些技术替代宏?

1. 常量定义 换用const

2. 函数定义 换用内联函数

上一篇:C语言扫雷详细代码分步实现流程

栏    目:C代码

下一篇:C++实现LeetCode(168.求Excel表列名称)

本文标题:C++浅析内联函数的使用

本文地址:http://www.codeinn.net/misctech/214636.html

推荐教程

广告投放 | 联系我们 | 版权申明

重要申明:本站所有的文章、图片、评论等,均由网友发表或上传并维护或收集自网络,属个人行为,与本站立场无关。

如果侵犯了您的权利,请与我们联系,我们将在24小时内进行处理、任何非本站因素导致的法律后果,本站均不负任何责任。

联系QQ:914707363 | 邮箱:codeinn#126.com(#换成@)

Copyright © 2020 代码驿站 版权所有