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

C++面试八股文:C++中,函数的参数应该传值还是传引用?的更多相关文章

  1. 深入理解python中函数传递参数是值传递还是引用传递

    深入理解python中函数传递参数是值传递还是引用传递 目前网络上大部分博客的结论都是这样的: Python不允许程序员选择采用传值还是传 引用.Python参数传递采用的肯定是"传对象引用 ...

  2. Java:方法的参数是传值还是传引用

    Java中方法的参数总是采用传值的方式. 下列方法欲实现对象的交换,但实际上是不能实现的. public void swap(simpleClass a,simpleClass b){ simpleC ...

  3. python函数的参数传递问题---传值还是传引用?

    摘要:在python中,strings, tuples, 和numbers是不可更改的对象,而list,dict等则是可以修改的对象.不可更改对象的传递属于传值,可更改对象属于传引用.想要在函数中传递 ...

  4. JAVA方法传递参数:传值?传引用?

    先来看下面这三段代码: //Example1: public class Example1 { static void check(int a) { a++; } public static void ...

  5. python中给函数传参是传值还是传引用

    首先还是应该科普下函数参数传递机制,传值和传引用是什么意思? 函数参数传递机制问题在本质上是调用函数(过程)和被调用函数(过程)在调用发生时进行通信的方法问题.基本的参数传递机制有两种:值传递和引用传 ...

  6. python函数传参是传值还是传引用?

    首先还是应该科普下函数参数传递机制,传值和传引用是什么意思? 函数参数传递机制问题在本质上是调用函数(过程)和被调用函数(过程)在调用发生时进行通信的方法问题.基本的参数传递机制有两种:值传递和引用传 ...

  7. 如何理解javaSript中函数的参数是按值传递

    本文是我基于红宝书<Javascript高级程序设计>中的第四章,4.1.3传递参数小节P70,进一步理解javaSript中函数的参数,当传递的参数是对象时的传递方式. (结合资料的个人 ...

  8. js中函数的参数为函数的情况即回调函数

    js中函数的参数可以是数组对象也可以是函数,当参数为函数时我们叫做回调函数 //定义回调函数function B() { console.log("函数B")setTimeout( ...

  9. Python中函数传递参数有四种形式

    Python中函数传递参数有四种形式 fun1(a,b,c) fun2(a=1,b=2,c=3) fun3(*args) fun4(**kargs) 四种中最常见是前两种,基本上一般点的教程都会涉及, ...

  10. 讲讲python中函数的参数

    python中函数的参数 形参:定义函数时代表函数的形式参数 实参:调用函数时传入的实际参数 列如: def f(x,y): # x,y形参 print(x, y) f(1, 2) # 1, 2 实参 ...

随机推荐

  1. Java面试——Redis

    一.Redis 为什么那么快 [1]完全基于内存,绝大部分请求是纯粹的内存操作,非常快速.数据存在内存中.[2]数据结构简单,对数据操作也简单,Redis中的数据结构是专门进行设计的.[3]采用单线程 ...

  2. Hash 表

    更多内容,前往 IT-BLOG 哈希表(Hash table,也叫散列表),是根据关键码值(Key value)而直接进行访问的数据结构.也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快 ...

  3. Json和对象之间的转换

    JSON是一种字符: json转对象: var str = '{"name":"admin","age":16,"sex" ...

  4. 图与网络分析—R实现(五)

    四 最大流问题 最大流问题(maximum flow problem),一种网络最优化问题,就是要讨论如何充分利用装置的能力,使得运输的流量最大,以取得最好的效果.最大流问题是一类应用极为广泛的问题, ...

  5. Kubernetes(k8s)集群安装JupyterHub以及Lab

    背景 JupyterHub 为用户组带来了笔记本的强大功能.它使用户能够访问计算环境和资源,而不会给用户带来安装和维护任务的负担.用户--包括学生.研究人员和数据科学家--可以在他们自己的工作空间中完 ...

  6. android studio 做登陆界面

    先来一个最简单的     AndroidManifest.xml <?xml version="1.0" encoding="utf-8"?> &l ...

  7. 香,一套逻辑轻松且智能解决PyQt中控件数值验证的问题

    在PyQt开发中,时常需要对控件的值进行校验,如需要校验QCheckBox是否被选中,QLabel是否校验值是否为空等等.在复杂的业务场景下,这类控件如果数量很多,逐个校验就显得麻烦,需要一一获得控件 ...

  8. Arch Linux安装笔记

    ​ 最近有些厌倦Windows,所以想尝试一下Linux,选择Arch的原因不再赘述,建议以ArchLinux官方安装指南为主,这篇笔记只是方便我自己安装而写的,仅供参考. 1. 安装前的准备 1.1 ...

  9. Java开发准备

    1.Java是一门面向对象的高级语言 JDK:是java development kit的缩写,意思是java程序开发的工具包. 可以用来开发Java和运行Java程序 JRE:Java Runtim ...

  10. AI降临,前端启用面壁计划

    作者:京东零售 郑炳懿 开篇: "在我们有生之年,你觉得会看到AI兵临城下的那一天吗?就像电影黑客帝国里面演的一样",Barry从红色的烟盒里取出一根烟发问道. "不可能 ...