inline、explicit关键字小结
inline
发生函数调用时,首先在栈内存上为形参分配内存,再将实参的值复制给形参,在函数局部还需要为变量分配内存,执行完还要将函数的返回地址放到栈内存中。如果调用开销甚至多于函数内部执行开销,那么这个调用是浪费性能的,需要进行优化。inline关键字的作用正是为了解决函数频繁调用大量消耗栈内存的问题,用inline修饰的函数叫做内联函数。
inline的实现原理是编译器在编译期间将整个内联函数体的代码插入到调用语句处。优点是不会发生函数调用,提升运行效率;缺点是插入代码会使最终可执行程序的大小增加。因此只有简单几个语句,快速执行的函数适合声明为内联函数。
inline
int min(int a, int b)
{
if (a < b) {
return a;
}
return b;
}
需要注意的地方:
a、编译器在判断内联函数时是审慎的,如果有人把一个开销的函数声明为inline,编译器会识破这个“恶作剧”,即inline声明只是一个“建议”,而决定权在编译器手中;
b、定义在类中的成员函数默认都是内联函数;或者类中函数声明为内联,在类外定义时需要加上inline修饰;
c、由于inline的实现原理限制,内联函数不能调用本身,不能包含复杂的结构控制语句例如while、switch等。
explicit
explicit关键字用于修饰类的构造函数,作用是禁止隐式调用构造函数。
cpp文档中是如此说明的:
This keyword is a declaration specifier that can only be applied to in-class constructor declarations . An explicit constructor cannot take part in implicit conversions. It can only be used to explicitly construct an object 。
#include <iostream>
using namespace std;
class Test
{
public:
explicit Test(int _a) :a(_a){};
int a;
};
int main()
{
Test t1 = 1; // 不存在从int转换到Test的合适的构造函数
Test t2(2);
return 0;
}
t1初始化那行发生了int到Test类型的隐式转换,由于explicit关键字,该行为被禁止。