函数传参string_C/C++的三种函数传值方式及其区别

C/C++函数传参方式我想很多朋友应该都知道,但是不同传参方式的背后他们的区别是什么我想很多人并不那么清楚。本文就给大家揭露一下各传参方式的区别。

传参方式有这三种:值传递、引用传递、指针传递

ade095756a207a0356e5eab432bc3436.png

大家可以去看三种传递方式的写法的区别,关于写法的区别就不在这里讲了。我只要将一下三种方式的运行效率和特征

值传递

我们在main函数里将func2和func3先注释掉,然后运行并查看汇编代码看看是什么结果,先看运行结果吧:

7e747dcdcd361a0879823a99ac0fc08f.png

说实话,汇编其实我不是很懂,但是用来比较运行效率是够用了的。这里将汇编的几个指令给大家稍微讲一下吧。

MOV 传送字或字节. (mov ax 2把2放入寄存器)

PUSH 把字压入堆栈

CALL 过程调用

好,了解这几个就够了,我们可以看到值传递在调用方法的时候先进行了两次传值,然后再压栈然后call了一个系统函数然后又传了一次值然后才是调用了func1,总共6个步骤。

接下来我们看看运行完后我们

cout<

看看test实参的变化,我们发现输出的还是:

origion

所以作为值传递,在运行函数后不管函数里面对实参进行了什么运算,是不会改变实参的值得

引用传递

接下来我们看一下引用传递,还是一样,先看汇编代码:

0e453589e22b0aaaf1e98cafebc9fc18.png

怎么样,是不是吓一跳,才两步,直接压栈然后就调用函数func2,这样运行速度该会比func1快多少呢。

下面看下实参test的变化,我们输出看一下:

changed

怎么样,是不是很神奇,居然将实参值给改变了,这是为什么呢?这是因为引用传递的时候是将参数的地址传递给了函数,这样在函数中的对实参所有操作都是直接在操作实参地址,所以他能将实参值改变。

指针传递

最后,我们看下指针传递,先看汇编代码:

4363df169bc8e9da7277e787dd393f30.png

步骤跟引用传递时一样的,然后我们看一下运行结果,输出一下test:

changed

我们发现实参也被改变了,这也是因为其实我们是将实参的地址传递给函数了。

实测效率差别

我们引入time.h来看运行时间。我们将每个方法的调用过程循环一百万次,看下运行时间差距

a9d2fa82bbd2851f0e298f2e2dca1e0c.png

结果如下:

ff10c315574b202890a953b17917e151.png

怎么样,这个差距还是蛮大的,这还是只有一个参数,要是多几个,并且参数尺寸大一些的话差距会更明显。最后把源代码给大家把,有兴趣的可以自己试一试

#include

#include

#include

#include

using namespace std;

string test = "origion" ;

string changed = "changed" ;

string getTime()

{

time_t tt =time(NULL);

tm* t =localtime(&tt);

t->tm_mon ;

string mon = to_string(t->tm_mon);

string day = to_string(t->tm_mday);

string hour = to_string(t->tm_hour);

string min = to_string(t->tm_min);

string sec = to_string(t->tm_sec);

string times = mon+"-"+day+":"+hour+":"+min+":"+sec ;

return times ;

}

void func1(string s)//值传递

{

s = changed ;

}

void func2(string& s)//引用传递

{

s = changed ;

}

void func3(string* s)//指针传递

{

*s = changed;

}

int main()

{

cout<

for (int i = 0; i < 1000000; i++)

{

func1(test);

}

cout<

for (int i = 0; i < 1000000; i++)

{

func2(test);

}

cout<

//func3(&test);

system("pause");

return 0 ;

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/507685.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

二维码提升对比度文献调研(5)--DeepLPF: Deep Local Parametric Filters for Image Enhancement

简介 &#xff08;1&#xff09;论文名称&#xff1a; DeepLPF: Deep Local Parametric Filters for Image Enhancement CVPR 2020 &#xff08;2&#xff09;论文链接&#xff1a; https://arxiv.org/abs/2003.13985 &#xff08;3&#xff09;源代码&#xff1a; https://gi…

c语言单选题大全,C语言单选题(五)

1.C语言结构体类型变量在程序执行期间(C)。A.部分成员驻留在内存中B.只有一个成员驻留在内存中C.所有成员一直驻留在内存中D.没有成员驻留在内存中2.当定义一个结构体变量时&#xff0c;系统分配给它的内存是(D)。A.结构中最后一个成员所需内存量B.结构中第一个成员所需内存量C…

java 匿名函数_Java 理论与实践,闭包之争

Java 语言是否应增加闭包以及如何添加&#xff1f;在跨越边界 系列最近的一篇文章中&#xff0c;我的朋友兼同事 Bruce Tate 以 Ruby 为例描述了闭包的强大功能。最近在安特卫普召开的 JavaPolis 会议上&#xff0c;听众人数最多的演讲是 Neal Gafter 的 “向 Java 语言增加闭包…

二维码识别中面临的主要问题

问题描述 下面有两个二维码的图片&#xff1a; 这两个二维码其实是一样的&#xff0c;也就是二维码码制在设计的时候&#xff0c;其实不需要那么大的黑点&#xff0c;只需要中心一小部分即可。 问题一&#xff1a;在优化二维码的过程中&#xff0c;能否考虑优化边缘部分&…

lia人是什么意思_69年属鸡人终身灾难是什么意思

69年属鸡人终身灾难是什么意思69年出生的生肖鸡&#xff0c;他们为人正直&#xff0c;有一颗转速飞快的脑袋&#xff0c;做事勤快&#xff0c;对生活非常乐观&#xff0c;但是因为过于自信总是做一些自己能力还不够的事&#xff0c;有句老话说的好“大难不死&#xff0c;必有后…

睡眠声音识别中的准确率问题(一)--问题描述及评价指标

1 问题描述 如何定义一个评价指标来评估睡眠声音识别中的准确率&#xff1f; 1.1 按照评分如何设计评价指标 睡眠声音识别预测的结果是一个概率分布&#xff0c;如下表所示&#xff1a; c1c_1c1​c2c_2c2​c3c_3c3​snortspeechcough0.50.20.70.550.450.77 在这种场景下&…

c51 嵌入汇编语言,在C51中嵌入汇编

在C51编程中&#xff0c;有时控制一些器件时&#xff0c;需要较强实时性&#xff0c;这时有必要在其中嵌入ASM语句&#xff0c;关于嵌入的方法众多&#xff0c;网上也可以找到相关说明&#xff0c;不过说得并不详细&#xff0c;这里结合本人调试18B20测温程序来说说如何在C中嵌…

睡眠声音识别中的准确率问题(二)--测试结果及分析

1 测试数据集介绍 &#xff08;1&#xff09;Audioset数据集&#xff1a; 从该数据集中筛选出鼾声数据500条&#xff1b; &#xff08;2&#xff09;人工采集的数据集&#xff1a;我们收集了鼾声及咳嗽数据50条&#xff0c;其中鼾声数据40条&#xff0c;咳嗽数据10条&#xff…

睡眠声音识别中的准确率问题(三)--采集的音频测试结果及分析

简介 本次我们对自己采集的93条Snoring音频进行测试并分析。 不区分音频质量的测试。 分别测试了NNN取1-5、8以及10时候的准确率&#xff0c;测试结果如下所示&#xff1a; N2345810Accuracy0.27960.47310.49460.49460.54840.5699 分析&#xff1a;从上表中可以得出…

中文 转gbk编码_go查找中文首字母

前言常见的通讯录都是按首字母来排序的&#xff0c;想象一下你要实现一个首字母排序的功能&#xff0c;若是全英文&#xff0c;那将会是一件很轻松的事情&#xff0c;一般语言层面就会提供排序方法&#xff0c;亦或自己实现也不是难事&#xff0c;那如果存在中文呢&#xff1f;…

语音增强相关技术综述

1 非监督语音增强技术 2 监督语音增强技术 3 github上提供的源代码及分析 3.1 Dual-signal Transformation LSTM Network 简介 https://github.com/breizhn/DTLN 用于实时噪声抑制的堆叠双信号变换 LSTM 网络 (DTLN) 的 Tensorflow 2.x 实现。这个存储库提供了在 python …

睡眠音频分割及识别问题(十二)--基于IOS的YAMNet音频识别(总结)

1 结构体 此部分定义了两个结构体用于存储音频信息&#xff1a; AudioFragment&#xff1a;用于存储单个音频片段&#xff08;0.975s, 16000Hz&#xff09;的标签评分信息&#xff1b;AudioInfo&#xff1a;用于存储整个音频信息&#xff0c;包含音频文件名、时间等基础信息&…

js 字符串替换_正则精要:玩转JS正则表达式,也许只需这一篇(建议收藏)

0.导引在正文开始前&#xff0c;先说说正则表达式是什么&#xff0c;为什么要用正则表达式&#xff1f;正则表达式在我个人看来就是一个程序可以识别的规则&#xff0c;有了这个规则&#xff0c;程序就可以帮我们判断某些字符是否符合我们的要求。但是&#xff0c;我们为什么要…

小米平板android最新版本,想要翻身还需努力 小米平板2安卓版评测

1依旧发烧&#xff1f;小米平板2评测如今的平板市场虽不能用日薄西山来形容&#xff0c;但各大厂商费尽心机惨淡经营也无力阻止平板电脑市场的衰落&#xff0c;iPad Air和Mini系列的销量下滑迫使苹果不得不用寄希望于iPad Pro打开一片新天地&#xff0c;而在手机行业风生水起了…

国内计算机类APP相关竞赛总结

中国高校计算机大赛–移动应用创新赛 http://www.appcontest.net/ 中国高校计算机大赛—移动应用创新赛”旨在促进高校计算机课程教学内容和教学方法改革&#xff0c;激发学生创新意识&#xff0c;提升学生利用计算机分析问题、解决问题的能力&#xff0c;特别是移动应用的设计…

flink 写kafka_flink消费kafka的offset与checkpoint

生产环境有个作业&#xff0c;逻辑很简单&#xff0c;读取kafka的数据&#xff0c;然后使用hive catalog&#xff0c;实时写入hbase&#xff0c;hive&#xff0c;redis。使用的flink版本为1.11.1。为了防止写入hive的文件数量过多&#xff0c;我设置了checkpoint为30分钟。env.…

论文阅读:超高分辨率图像中快速、准确的条码检测

摘要 由于目标对象的尺度不同&#xff0c;超高分辨率 (UHR) 图像中的对象检测长期以来一直是计算机视觉中的一个具有挑战性的问题。在条码检测方面&#xff0c;将 UHR 输入图像调整为更小的尺寸通常会导致相关信息的丢失&#xff0c;而直接处理它们的效率很高且计算成本很高。…

android 多线程 场景,精选Android初中级面试题 (三): 深探Handler,多线程,Bitmap

码个蛋(codeegg) 第 930 次推文作者&#xff1a;Focusing链接&#xff1a;https://juejin.im/post/5c85cead5188257c6703af47Handler1、谈谈消息机制Handler作用 &#xff1f;有哪些要素 &#xff1f;流程是怎样的 &#xff1f;参考回答&#xff1a;负责跨线程通信&#xff0c;…

通过超分辨率重构来提高二维码的对比度

1 问题描述 &#xff08;1&#xff09;图像分辨率小。例如一些嵌入在海报&#xff08;如图1&#xff09;或远距离拍摄的码&#xff0c;其分辨率远小于通常情况下的码图像。 图1.海报中的二维码占比很小 &#xff08;2&#xff09;图像质量较低。有很多是经过了多次的压缩和转…

android web 访问数据库,Web下的JDBC访问数据库的基本步骤

Web下的JDBC访问数据库的基本步骤(2012-06-02 12:09:33)在Java程序中连接数据库的一般步骤分为一下几部分&#xff0c;我摘录出来&#xff0c;跟大家分享。(1)将数据库的JABC驱动加载到classpath中&#xff0c;在基于JavaEE的Web应用开发过程中&#xff0c;通常把JDBC驱动放在W…