这一讲是承接《 C++基础精讲篇第2讲》的内容补充之一。读者们可以先把上一讲的知识学习了以后,再学习这一讲的相关知识。这一讲主要为大家分享C++特有的内联函数、auto关键字、基于范围的for循环以及指针空值。希望大家在我的文章的帮助下,能有所收获,那我们就开始学习吧。
目录
1、内联函数
1.1 定义
以inline修饰的函数叫做内联函数,编译时C++编译器会在调用内联函数的地方展开,没有函数压栈的开销,其可以提高程序运行的效率。
1.2 用法介绍
首先我们写一个常规的求和函数,如下图所示,在调试过程中,利用vs编译器的“反汇编”命令查看程序的底层原理,从汇编中可以看出,利用push命令将实参1和2传递给形参a和b,然后利用call命令调用ADD函数,最终得到求和结果。这是常规的函数调用的利用汇编查看的底层原理。
#include<stdio.h>
using namespace std;
int ADD(int a, int b)
{
return a + b;
}
int main()
{
cout << ADD(1, 2) << endl;
if (ADD(1, 2))
{
cout << ADD(1, 2) << endl;
}
return 0;
}
在分析内联函数的工作原理时,首先需要对VS编译器进行设置,首先需要确保在Debug模式下,因为在release条件下,可能会被系统优化,使得查看不了内联函数的效果,然后分以下三步骤进行设置即可。
当我们完成以上步骤设置后,采用以下函数分析:同样利用上面分析的ADD求和函数,此时我们在ADD函数前面加上“inline”,我们才用同样的调试方法,利用vs编译器的“反汇编”命令查看程序的底层原理,从汇编中可以看出,利用inline将函数展开,而不是采用call命令进行调用。
#include<stdio.h>
using namespace std;
//内联:在函数名前用inline表示
//在符合其条件的情况下,在调用的地方展开
inline int ADD(int a, int b)
{
return a + b;
}
int main()
{
cout << ADD(1, 2) << endl;
if (ADD(1, 2))
{
cout << ADD(1, 2) << endl;
}
return 0;
}
通过上面的对比,我们可以看到,利用inline将函数变成内联函数,相比于正常的通过开辟函数栈帧进行函数调用的方法,利用内联函数则是直接将函数展开,可以极大的提高程序的运行效率。但inline不是无所不能的,其也是需要在一定条件下使用,下面我将重点分析。
1.3 特性
1.3.1 使用注意事项
1、 inline是一种以空间换时间的做法,省去调用函数的开销。但正是因为如此,如果代码很长,或者有循环/递归的函数不适宜将其作为内联函数,因为在编译过程中如果将代码展开,则经过编译出来的可执行程序会变很大。
2、inline对于编译器而言只是一种建议,编译器会自动优化,如果定义为inline的函数体内有循环/递归等,编译器优化时会忽略掉内联。
3、inline不建议声明和定义分离,分离会导致链接错误,因为inline将函数展开以后,就不存在函数地址了,此时链接就不能在符号表中找到该函数,即链接失效。
1.3.2 举例说明
针对使用注意事项1和2,我将一起举例为读者说明原因:

最低0.47元/天 解锁文章
1505

被折叠的 条评论
为什么被折叠?



