某日二师兄参加XXX科技公司的C++工程师开发岗位第8面:

面试官:C++中,函数的参数应该传值还是传引用?

二师兄:要看参数的用途。如果是出参,必须传引用。如果是入参,主要考虑参数类型的大小,来决定传值还是传引用。

面试官:为什么不使用指针?

二师兄:传指针也称之为传引用(pass by refereence)。但是在C++中不推荐使用指针,因为指针需要判断是否位空,而引用则无需担心。

面试官:入参传值还是传引用有什么标准吗?

二师兄:没有标准吧。一般参数类型大小大于16字节(64位操作系统)时,传引用效果要好于传值。

面试官:为什么?

二师兄:因为传值相当于拷贝构造,当变量的类型尺寸大于16字节时,拷贝构造所消耗的时间大于解引用。此时传引用收益更高。

面试官:你知道函数参数传递的过程中,寄存器起什么作用吗?

二师兄:额。。了解过一些。一般简单的数据类型,可以通过寄存器传递。而对于结构图和类则使用是通过堆栈传递参数。当然不同的编译器对此实现不尽相同。

面试官:那么你知道什么是cdelstdcallfastcallthiscall吗?

二师兄:听说过,不是很了解。。

面试官:好的,回去等通知吧。

今日二师兄的表现比较稳定,只有最后一问没有回答上来:

你知道什么是cdelstdcallfastcallthiscall吗?

这些都是C++中的函数调用约定。它们决定了函数参数的传递方式和堆栈的清理方式。

  1. cdecl是默认的调用约定,它将参数按照从右到左的顺序依次压入堆栈中,由调用者负责清理堆栈
  2. stdcall将参数按照从右到左的顺序依次压入堆栈中,由被调用函数负责清理堆栈
  3. fastcall将前两个整型指针参数存储在寄存器中,其余参数按照cdecl约定压入堆栈中。
  4. thiscall是用于成员函数的调用约定,它将this指针作为隐式参数传递,并将其存储在寄存器或堆栈中,其余参数按照cdecl约定压入堆栈中。

需要注意的是,这些约定可能因编译器和平台的不同而不同。

好了,今日份面试到这里就结束了,小伙伴们,对于今天二师兄的面试,能打几分呢?

关注我,带你21天“精通”C++!(狗头)

二进制架构
4 声望7 粉丝