目录
内联函数
什么是内联函数
内联函数是一种特殊的函数,区别与其他函数的地方在于,内联函数没有函数栈帧也不会产生函数调用,它会在函数调用处展开函数体内的代码。
内联函数的定义格式与普通函数类似,不同之处在于需要使用关键字 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}; //会编译失败
封面