c++入门之内联函数,auto关键字

内联函数

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

inline int Add(int a, int b) {
	return a + b;
}



int main() {


	int ret = Add(3, 5);

	return 0;
}

比如说如上图的 Add函数就是一个内联函数,会在函数调用时将其展开。
································································································

我们可以通过汇编代码来观察一下内联函数和普通函数的区别:

如图1(非内联函数) :
c++入门之内联函数,auto关键字_第1张图片
可以看到在调用函数时会通过 call 来表明调用了该函数

如图2(内联函数):
c++入门之内联函数,auto关键字_第2张图片
可以看到使用了内联函数并没有call 而是直接将函数展开

内联函数的特性:

  1. inline 是一种以空间换时间的做法,省去调用函数额开销。所以代码很长或者有循环/递归的函数不宜使用内联函数。

  2. inline对于编译器而言只是一个建议!! 编译器会自动优化,如果定义为inline的函数体内有循环/递归等,编译器优化时会忽略掉inline

  3. inline不建议声明和定义分离,分离会导致链接错误。因为inline被展开,就失去了函数地址,链接时无法找到。

auto关键字 (c++11)

关于auto:
在 c++11中,auto不再是一个存储类型的指示符,而是作为一个新的类型指示符来指示编译器,auto声明的变量必须由编译器在编译时期推导而得。

基本使用:

int main() {
	int a = 10;
	auto b = a; //编译器会通过a的类型在编译时推导出b的类型为int
	auto c = 'a'; //编译器通过'a'的类型推导出c的类型为char
	cout << typeid(b).name() << endl;
	cout << typeid(c).name() << endl;
    //auto e; 编译不通过,必须初始化

	return 0;
}

运行结果:c++入门之内联函数,auto关键字_第3张图片

注意:
使用auto定义变量时必须初始化,因为在编译阶段编译器需要根据初始化的值来推导变量的类型。 因此auto并非是一种 “类型” 的声明,而是一个类型声明时的 “占位符”,编译器在编译期会将auto替换为变量实际的类型。

auto与指针,引用的结合使用:

int main() {
	int x = 10;
	auto a = &x;//定义指针类型
	auto* b = &x;//同上,定义指针类型,auto与auto*没有区别
	//auto* b = 10; 不被允许的定义
	auto& c = x; // 定义引用类型,必须加&
	cout << typeid(a).name() << endl;
	cout << typeid(b).name() << endl;
	cout << typeid(c).name() << endl;




	return 0;
}

运行结果:
c++入门之内联函数,auto关键字_第4张图片

在同一行定义多个变量:

int main() {
	auto a = 1, b = 2;//允许的
	auto a = 1, b = 2, 2;//不被允许的,a 与 b的初始化表达式类型不同



	return 0;
}

auto不能推导的场景:

1. auto不能作为函数的参数
void TestAuto(auto x)
{
}
 //不被允许的,编译时报错
2.auto不能直接用来声明数组
auto b[]={1,2,3} //不被允许的,编译时报错

### 基于范围的for循环(c++ 11) #### 范围for循环的语法
int main() {
	int arr[] = { 1,2,3,4,5,6 };
	for (auto& e : arr) { // 本质是迭代器,e不断的从arr中取值
		e *= 2;//让arr数组中的每个值乘2
		e += 1;//让arr数组中的每个值加1
	}

	for (auto e : arr) {
		cout << e << "  "; // 3 , 5, 7, 9, 11, 13
	}


	return 0;
}

运行结果:
c++入门之内联函数,auto关键字_第5张图片
注意:
for循环的迭代范围必须确定,对于数组来说,范围就是一个元素到最后一个元素;对于类而言,应该提供begin 和 end 的方法


希望我的博客对你有所帮助,谢谢观看!

你可能感兴趣的:(c++,开发语言)