致即将进入职场的你
许久不见,距离在下上次发文章已经过去两年,而我也已经从一个新人研究生变成了即将进入职场的毕业生。我写下本文的契机是,本人在回顾面试的知识点时进行了如何利用面经的条条框框来优化代码的思考,然后发现了许多在死记硬背之外的有趣的地方,迫切的想要记录下来。希望阅读本文的各位,在准备面试、正式工作前也能有这样的思考,把背下来的东西变成自己的武器。
指针和引用
指针和引用的面经我们肯定都背过,那么为什么要用指针呢?什么时候要用引用呢?
作为参数
我在被华为鸿某部门面试时,我在做算法时对于函数的参数使用了引用的形式,被问到为何这里用引用。当时我脱口而出的回答是能在函数内修改函数外部的变量内容,他认为只需要用参数指针就行了,使用引用是一种不合适的写法。
我当然很不服,因为我在力扣上刷题的时候大部分函数模板的参数都是引用的形式,我认为肯定有这种用法的道理,于是我自己研究了很久为什么用引用,最后找到了几个很有道理的解答。
我们都知道,函数使用拷贝的方式传入参数,如果我们不使用指针或引用传参,那么函数会对输入创建一个拷贝来进行函数内的操作,而创建拷贝(参数为对象还会有构造过程)会消耗比较多的时间和空间,那么首先,在不需要保证参数不被改变时,我们使用指针或引用的参数来优化传参过程(尤其是传入对象),来避免额外的构造和析构。理论上,C++的内置数据类型(如int)可以直接按值传参,不需要使用引用,但是我会一律考虑使用引用。
然后是指针和引用传参的选择问题,有说法认为传指针实际是对指针进行拷贝,所以对于大的数据一律使用引用传参。而在我认知里指针的大小是固定为8bit的,所以这个大的数据我不懂是什么意思,总之可以认为引用传参是大部分情况下的首选。
如果函数定义时没有用引用传参,我又想优化,是不是没救了。神技:ref关键字,在函数调用时对参数使用,可以直接指示参数按引用传递。
如:a = function(ref( n ));