概要
这篇博客主要整理和总结了 inline 、 auto 、nullptr 关键字的用法。
文章目录
内联函数关键字 inline
首先我们知道在c环境下的程序编译要经过,预处理、编译、链接等等。
在预处理环节当中,c语言会展开头文件、将注释消除、替换define所定义的宏。
什么是宏?宏有什么优点?
宏相对于函数来说它将宏函数在预处理阶段进行展开,替换宏定义的变量。
对于一些短小的函数,在预处理阶段将其替换,会加快程序的执行效率。
但是相对的宏函数有自己的副作用。这些副作用来自于它不会对参数进行检验,并且一旦改变参数的输入格式可能会产生未知的后果
#include<iostream>
using namespace std;
#define MAX(a,b) ((a)>(b)?(a):(b))
//这是一个比大小的宏
int main()
{
int a = 10, b = 11;
cout << "a : " << a << endl;
cout << "b : " << b << endl;
cout<< MAX(++a, b) << endl;
cout << "a : " << a << endl;
cout << "b : " << b << endl;
return 0;
}
以上代码可以看出虽然使用了宏函数比出大小,但是出现了不希望的结果。比较了一次永久的改变了a的值。
在c++中的内联函数 inline 关键字
内联函数是指在一个函数前加一个关键字inline,内联函数会将inline函数修饰的直接展开。与define定义的宏函数相似的是inline修饰的内联函数也是在编译的是偶进行替换。
#include<iostream>
using namespace std;
inline int Add(int left, int right)
{
return left + right;
}
int main()
{
int a = 10, b = 11;
Add(a, b);
return 0;
}
在vs2013的编译器下,我们可以看到好像这个内联函数并没有展开,而是使用了call指令进行调用。那么inline到底用了没有?
随后使用了 release 进行调试,这次好玩了连main()函数都没了。
最后经过查阅相关资料,要想看到inline的调用过程,
右击源文件–> 属性 --> c/c++常规 --> 信息调用模式 -->选择程序数据库
右击源文件–> 属性 --> 优化 --> 内联函数扩展 -->选择只适用于扩展inline
由此可以看到,没有使用call指令进行调用函数。而是使用了加法指令add。
如何判断了内联函数的使用?
inline只是一个建议性的关键字。所谓建议指的是编译器在进行编译的时候,对其是否使用inline的优化加以建议。编译器一般比较喜欢那些,函数体短的,没有循环的,没有递归的代码来当做inline处理。
例如,如果这个函数又臭又长,你还加入了inline关键字,编译器自然不愿意去把这份代码复制多份加入到main()里面。耗时耗力
inline int Add( int a ,int b)
{
Add(a,b