首页 > 编程语言 >C++面试八股文:C++中,函数的参数应该传值还是传引用?

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

时间:2023-06-13 23:33:54浏览次数:47  
标签:面试官 八股文 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约定压入堆栈中。
    需要注意的是,这些约定可能因编译器和平台的不同而不同。

标签:面试官,八股文,C++,参数,引用,堆栈,传值
From: https://www.cnblogs.com/bujidao1128/p/17478993.html

相关文章

  • C++面试八股文:什么是RAII?
    某日二师兄参加XXX科技公司的C++工程师开发岗位第13面:面试官:什么是RAII?二师兄:RAII是ResourceAcquisitionIsInitialization的缩写。翻译成中文是资源获取即初始化。面试官:RAII有什么特点和优势?二师兄:主要的特点是,在对象初始化时获取资源,在对象析构时释放资源。这种技术可以......
  • C++面试八股文:什么是RAII?
    某日二师兄参加XXX科技公司的C++工程师开发岗位第13面:面试官:什么是RAII?二师兄:RAII是ResourceAcquisitionIsInitialization的缩写。翻译成中文是资源获取即初始化。面试官:RAII有什么特点和优势?二师兄:主要的特点是,在对象初始化时获取资源,在对象析构时释放资源。这种技术可以......
  • 《C++》类和对象
    C++面向对象的三大特性:封装、继承、多态封装将属性和行为作为一个整体,表现生活中的事物。对属性和行为加以权限控制。classCompute{ //访问权限public: intAdd(intx,inty) { returnx+y; } intSub(intx,inty) { returnx+y; } intMul(intx,inty) {......
  • 现代C++学习指南-方向篇
    C++是一门有着四十年历史的语言,先后经历过四次版本大升级(诞生、98、11、17(20),14算小升级)。每次升级都是很多问题和解决方案的取舍。了解这些历史,能更好地帮助我们理清语言的发展脉络。所以接下来我将借它的发展历程,谈一谈我对它的理解,最后给出我认为比较合理的学习路线指南。C++0......
  • 论c++实现sql连接
    寻找关于c++对sql连接的过程非常艰辛。今天要做一个简单项目,要求在远程sql上实现对数据的实时模拟,每五分钟进行一次随机产生数据并写入。在此之前我并没有用过代码实现sql连接的经历,在翻阅无数资料后,终于实现了使用visualstudio对mysql的连接。第一步,添加mysql的依赖文件,在v......
  • 《C++》函数重载
    函数默认值函数调用时传入数据则覆盖默认值,反则使用默认值intAdd(inta,intb=0,intc=0){ returna+b+c;}intmain(){ intret=Add(1,3); cout<<ret<<endl; system("pause"); return0;}如果从一个位置设置默认参数,其后也必须设置默认参数若函数声明有默认......
  • 现代C++学习指南-类型系统
    在前一篇,我们提供了一个方向性的指南,但是学什么,怎么学却没有详细展开。本篇将在前文的基础上,着重介绍下怎样学习C++的类型系统。写在前面在进入类型系统之前,我们应该先达成一项共识——尽可能使用C++的现代语法。众所周知,出于兼容性的考虑,C++中很多语法都是合法的。但是随着新......
  • Python调用C/C++动态库
    一、编译C++代码并封装成动态库1、创建编译dll文件的项目,在上面的官网介绍的更详细,这里就不多做介绍了。注意在vs之中新建一个项目,项目选择动态链接库(DLL)2、2.在源文件中添加cpp文件并写好函数#include<iostream>#defineMATHLIBRARY_APIextern"C"__declspec(dllexport)......
  • C++之继承(万字长文详解)
    继承继承的概念继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称派生类。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。以前我们接触的复用都是函数复用,继承......
  • C++销售管理助手[2023-06-13]
    C++销售管理助手[2023-06-13]用c++线性结构写一个完整程序,题目如下小美学完线性表后,想设计一个小程序,管理自己的网店销售情况,她想实现以下功能,请设计程序帮她实现:(1)可以录入商品信息,格式如下:(商品编号、商品名称、数量、进价、标价、折扣、售价)样例:(c0001,海飞丝,40,20,30......