内联函数与auto关键字

目录

内联函数

什么是内联函数

 内联函数的特性

auto关键字

简介

auto的特性


内联函数

什么是内联函数

内联函数是一种特殊的函数,区别与其他函数的地方在于,内联函数没有函数栈帧也不会产生函数调用,它会在函数调用处展开函数体内的代码。

内联函数的定义格式与普通函数类似,不同之处在于需要使用关键字 inline 来修饰函数声明,内联函数的定义格式如下:

inline 返回类型 函数名(参数列表)
{
    // 函数体
}

想象展开图

 

 内联函数的特性

优点:内联函数可以减少函数调用和返回的开销,提高程序的执行效率

缺点:由于内联函数在每个调用点都会展开,如果内联函数的函数体过于庞大可能会导致代码膨胀,因此内联函数适合定义简单的、频繁调用的函数。

是否将该函数修饰成内联函数取决于编译器,inline关键字对于编译器而言只是一个建议。一般而言函数规模越小(大该十几行代码)且不是递归、调用频繁编译器都会采用你的建议。

在默认的debug模式下,编译器不会采用inline关键字的建议,需要对编译器进行设置。

vs2019环境下

 内联函数的声明和定义必须在同一个文件中,原因是:编译器需要知道函数提的实现细节才能对其进行内联展开,如果只有函数的声明而没有定义,编译器无法知道函数具体实现的代码。

auto关键字

简介

随着c++的深入学习程序中用到的类型会越来越复杂,经常体现在:类型难于拼写、含义不明确导致容易出错,例如下面这段代码

void TestAuto()
{
	const std::map<std::string, std::string> m;

	//无需在意这段代码是什么意思只要知道
    //std::map<std::string, std::string>::const_reverse_iterator是一个类型就行
	std::map<std::string, std::string>::const_reverse_iterator it = m.rbegin(); 
}

这写起来不爽死,于是在c++11中将一个没人使用的关键字auto赋予了全新的含义:auto可以根据初始化的表达式来自动推导出auto的实际类型。

要注意的是auto并非是一种类型,而是一种类型“占位符”,编译器在编译阶段会将auto替换为变量实际的类型。

于是上面这一长段的类型就可以被替换为:

void TestAuto()
{
	const std::map<std::string, std::string> m;

	//auto会根据右边的表达式自动的推出类型
	auto it = m.rbegin(); 
}

auto的特性

auto可以自动推导出指针的类型

int a = 0;
auto b = &a;   //可以自动推导出int*

auto在推导引用类型时必须加上引用操作符

int a = 0;
auto& c = a;  //需要加上引用操作符,因为编译器不知道你需要推导的是int还是int&

在同一行定义多个变量,这些变量必须是相同的类型,否则编译器将会报错因为编译
器实际只对第一个类型进行推导,然后用推导出来的类型定义其他变量

auto a = 2, b = 3.14;   // 该行代码会编译失败,因为a和b的初始化表达式类型不同
auto c = 4, d = 5;      //c和d类型相同可以编译通过

 auto不能作为函数的参数

// 此处代码编译失败,auto不能作为形参类型,因为编译器无法对a的实际类型进行推导
void TestAuto(auto a)
{
    //函数体
}

auto不能直接用来声明数组

int a[] = {1,2,3};
auto b[] = {4,5,6}; //会编译失败

封面 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值