序言
本文学习 this指针 + inline内联函数
1. this指针
什么是this指针
通常在类定义时要用到类型变量自身,这时候还不知道变量名(为了通用也不可能固定实际的变量名),就用this指针来使用变量自身
struct、class和int char等一样,都是变量类型,比如类class myclass,用它来声明变量myclass my,则my的this指针就是指向my的指针,this的类型就是myclass *类型
this指针原理
this指针作用域在类内部,在类的非静态成员函数访问类的非静态成员时,编译器会自动将对象本身的地址作为一个隐士参数传递给函数
在成员函数内部,我们可以直接使用调用该函数的对象的成员,而无需通过成员访问运算符来做到这一点,因为this所指的正是这个对象。任何对类成员的直接访问都被看成this的隐式使用,编译器在编译时加上this指针作为非静态成员函数的隐士形参
this指针并不是对象的一部分,this指针保存当前对象的内存地址,每个对象的this指针都是常量指针,不允许改变this中保存的地址,this指针时刻指向实例对象本身
this指针的使用
- [1] 在类的非静态成员函数中返回类对象本身的时候,直接使用 return *this;
- [2] 另外一种情况是当参数与成员变量名相同时,如this->n = n (不能写成n = n)。
2. inline内联函数
什么是inline内联函数
与宏定义类似,编译器将使用相应的函数代码替换函数调用
在C++的类成员中,如果成员函数的函数体本身结构不复杂,代码量也较少的时候,直接在定义这个函数的时候就完成该函数的实现,这样的一个过程在C++类中会被默认当做内联函数
class A
{
public:
int a;
int b;
int addresult()
{
return a + b;
}
private:
};
inline内联函数的原理
内联函数是C++的增强特性之一,用来降低程序的运行时间。当内联函数收到编译器的指示时,即可发生内联:编译器将使用函数的定义体来替代函数调用语句,这种替代行为发生在编译阶段而非程序运行阶段。
通过inline声明,编译器首先在函数调用处使用函数体本身语句替换了函数调用语句,然后编译替换后的代码。因此,通过内联函数,编译器不需要跳转到内存其他地址去执行函数调用,也不需要保留函数调用时的现场数据
inline内联函数的分类
内联函数主要分为两种:类内内联函数 + 类外全局内联函数- 定义函数时在函数前加上“inline”关键字声明函数
//类内
//见上面的例子:不用显示的去声明
//类外
class A
{
public:
int minus(int a, int b);
};
inline int A::minus(int a, int b)
{
return (a - b);
}
为什么要使用inline内联函数
- 使用内联函数目的是为了消除函数调用上的开销,频繁的调用函数会增加内存上的开销
inline内联函数与宏定义的区别
- 在传统C中对减少调用引起的内存消耗的方法是宏定义。但是宏定义存在着很多的问题:
[1] 宏定义是预处理器来执行命令的,而不是编译器。而预处理器执行的宏命令是对其进行单纯的词语替换,没有任何的语法分析可言。
[2] 在使用宏命令的时候往往会引发一些很容易被忽略掉的错误。比如变量多次递增等
[3] 宏定义是强制的内联展开,可能会污染所有的命名空间和代码;而内联声明只是对编译器的一种建议,由编译器来决定是否采用
《Effective C++》一书中建议“尽量少用预处理器,而多用编译器”。
inline内联函数使用场合
当对程序执行性能有要求时
当想宏定义一个函数时,果断用内联函数
在类内部定义的函数会默认声明为inline函数,有利于类实现细节的隐藏
注意事项
内联声明只是一种对编译器的建议,编译器是否采用内联措施由编译器自己来决定。甚至在汇编阶段或链接阶段,一些没有inline声明的函数编译器也会将它内联展开。
所有类内实现的函数都默认声明为内联函数,不用显示声明inline
虚函数不允许内联
内联函数定义可以放到头文件中,但并非所有头文件中定义的函数都是内联函数
内联函数是用空间换时间的做法,应尽量定义成频繁调用且功能简单的函数,简化函数体,如果函数体过长或者有多条循环语句、条件语句或递归,则不宜用内联函数
inline是一种“用于实现的关键字”,而不是一种“用于声明的关键字”,inline应与函数定义(实现)体放在一起
由于内联函数在调用的时候直接暴露出了函数体,可能造成泄漏函数功能的现象
Acknowledgements:
http://www.cnblogs.com/liushui-sky/p/5802981.html
http://blog.csdn.net/helinlin007/article/details/8112091
http://www.cnblogs.com/QG-whz/p/4641479.html
2017.09.30