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,如果是对象,则使用引用。

 

posted @ 2019-03-02 20:50  Derek丶D  阅读(246)  评论(0编辑  收藏  举报