C++ 函数探幽
内联函数:
工作原理:
将一些短小的函数, 声明为inline类型, 编译器在编译时,会直接替换函数调用处的代码
为什么会有内联函数:
在程序运行时, 如果调用了函数, 会经历以下步骤:
1. 拷贝参数,内存中跳转到当前函数的机器码内,复制参数, 运行代码
2. 将函数的返回值放在CPU寄存器或某个内存地址中
3. 回到被调用的代码处,取出返回值
可以看到 ,一个函数调用会经历很多步骤, 这些步骤也会加大内存开销,降低程序运行效率。
但是有些函数的复用性很高, 写成函数用来调用, 会减少代码量, 所以就出现了内联函数
直接替换代码行,减少了来回跳转的过程
但是也不是每个函数都要写成内联函数的
内联函数只建议一些代码量小, 复用性高的函数使用。
引用变量:
使用引用作为函数的参数时,应尽量使用const 修饰符, 原因如下:
1. 防止代码无意中修改数据的值
2. const 形参可以同时接收const 和非const 参数,而非const形参,只能接受非const 参数
3. const 引用使函数能够正确生成并使用临时变量。
当参数类型和函数类型不匹配时,如果你意图是修改实参, 那么C++ 默认的机制会阻止这种行为
假如参数不匹配, C++ 会生成一个临时的类型正确的变量, 并将类型不匹配的实参,强制转换为 和形参对应类型的变量
此时, 函数中的引用形参就会指向新的临时变量, 所以不会修改实参的值。
将引用作为返回值时需要注意的事项:
为何要将引用作为返回值:
函数结束时,会将返回值复制到寄存器或者内存中某个位置上,如果这个值只是一个int等基本类型,这样没什么影响
但是如果返回一个非常大的数据,那么复制返回值的这一步, 会降低程序的运行效率
但是如果此时返回一个引用, 那么这个引用最大的长度也不过是内存的大小,会提升程序的效率
但是需要注意的, 返回的引用不能是函数中生成的临时变量(局部变量)
因为局部变量在函数运行结束后就会被释放,此时如果直接访问返回值, 会导致程序访问空引用, 进而崩溃
应当返回函数参数列表中的应用, 因为这个引用是在函数调用之前就已经指向的内存, 在函数运行结束之后返回值 也能访问的到。
将引用用于类对象需要注意的事项:
对象,继承,和引用:
ofstream 和 ostream类:
这两个类是继承关系,ofstream继承于ostream
因为这两个类可以进行强制类型转换
所以ostream & 的引用可以指向 ofstream 对象
总计, 合适使用引用作为参数:
一、只是传递值,而不修改值:
1,如果数据对象很小, 比如内置的基本数据类型, 按值传递
2,如果数据对象是数组 , 则按指针传递, 因为这是唯一的选择,因为不修改值,所以要在函数声明中加入const
3,如果数据对象是较大的结构,则按const 引用或const指针传递, 提高程序运行效率, 节省复制数据对象所需的时间
4,如果数据对象是类对象, 则使用const 引用, 类设计的语义常常要求使用引用, 这是C++新增这项特性的主要原因, 也是标准方式。
二、修改调用的参数
1,如果是内置数据类型, 使用指针
2,如果是数组,则只能使用指针
3,如果是结构,使用指针或引用。
4,如果是对象,则使用引用。