内联函数
内联函数的概念:以关键字inline修饰的函数称为内联函数。C++编译器会在函数调用的地方直接展开,而不是去调用 函数,这样避免了函数栈帧的创建,可以提高效率
看看没有inline修饰的函数,他是去调用函数(call是调用的意思),建立函数栈帧
int Count()
{
int a = 10;
return a;
}
int main()
{
Count();
return 0;
}
加上inline修饰的函数还会去调用吗? 下面两种方法都不会去调用 1,加上inline,改为release版本下运行,打完断点,转到反汇编,你会发现函数都点进不去(这路就不试了) 2,加上inline,在Debug版本下设置一下,因为编译器的Debug版本下,默认是不会优化的,设置方式如图 点开该项目的属性
inline int Count()
{
int a = 10;
return a;
}
int main()
{
Count();
return 0;
}
inline函数的特性 1,以空间换时间,避免函数栈帧的创建,但是函数中有循环或者递归就不适合用内联,因为展开的话会超级长 2,对编译器仅仅是个建议,听不听还要编译器的心情 ,哈哈 3,inline修饰函数在多文件中,声明和定义是一定不能分开的,因为inline函数会被展开,从而找不到函数的地址
提一下宏的优点和缺点 1,增强代码的复用性 2,提高性能
缺点: 1,不方便调试 2,没有类型检查 3,代码可读性差,可维护性差,易出错
C++有什么可以替代宏的吗? 1,const 修饰的常量 2,inline修饰的函数
auto
C++中的auto不是用来定义局部变量,而是来进行推导变量的类型的
1,auto定义的变量必须初始化 2,auto可以一行定义多个变量,但是每个常量必须相同
int main()
{
int a = 10;
auto b = a;
auto c = "a";
auto d = &a;
auto* e = &a;
auto& f = a;
auto x = 10, y =20;
auto x = 2.2, y = 10;
return 0;
}
auto不适合的场景是 1,不适合做函数的参数,(可以作为返回类型,VS2019不报错) 2,不适合用来定义数组
范围for的用法
int main()
{
int a[] = { 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16 };
for (auto e : a)
{
cout << e << " ";
}
return 0;
}
如果要改变数组中的元素要怎么办? 分号左边改为引用即可 auto&
但是这里有个问题,万一是数组参数中的数组名会怎么样(这里就是指针了,无法确定数组的范围,就会报错)
void test2(int a[])
{
for (auto e : a)
{
cout << e << endl;
}
}
空指针,以后使用nullptr就行
C++中的NULL解释为了 0,虽然不会出现什么错误,但是还是存在一点小问题
#ifndef NULL
#ifdef __cplusplus
#define NULL 0
#else
#define NULL ((void *)0)
#endif
#endif
例如:
|