乐趣区

关于c++:C面试八股文C中函数的参数应该传值还是传引用

某日二师兄加入 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++!(狗头)

退出移动版