函数传参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;能否考虑优化边缘部分&…

java对象与c网络语言通信,JAVA与C语言的网络通信代码案例.pdf

java socket 与linux c 通信问题97w211 : 2010-2-09 18:08 :发表于 来源 科技复兴如题&#xff0c;用java 做客户端&#xff0c;linux 的c 程序做服务器端。目前客户端向服务器端发送信息已经没问题&#xff0c;但是在添加服务器端向客户端发送信息的功能时却出现了死循环。在E…

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中嵌…

python免费网络采集_python网络数据采集7 采集一个网站所有的外链

[python]代码库from urllib.request import urlopenfrom bs4 import BeautifulSoupfrom urllib.parse import urlparseimport reimport randomimport datetime#采集一个网站所有的外链pages set()random.seed(datetime.datetime.now())allExtLinks set()allIntLinks set()de…

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

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;从上表中可以得出…

研究c语言,研究c语言计算机编程实验.docx

2019年研究C语言计算机编程实验C语言是计算机软件编程设计中的一种重要应用语言&#xff0c;也是高等院校计算机专业中实践性较强的一门计算机编程教学课程&#xff0c;研究C语言计算机编程实验是为各位计算机的同学推荐的论文&#xff0c;欢迎大家阅读探究计算机移动技术应用!…

学完python基础后该学什么_想提一个老生常谈的问题, Python 基础学完后我应该干啥?...

日期 : 2020-09-21 09:48:32作者 : 南门老徐三十岁是一个迷茫的年纪&#xff0c;之前所有的信念都会在这一刻烟消云散。我是做数据的&#xff0c;非科班出身&#xff0c;除了数据啥也不会....java 我也不会&#xff0c;丢人不&#xff1f;而且数据也感觉自己并不咋地&#xff5…

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

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

c语言printf的%f语句,在C语言里printf是什么意思怎么

在C语言里printf是什么意思&#xff1f;怎么用??1&#xff0c;printf()函数是格式化输出函数, 一般用于向标准输出设备按规定格式输出信息。2&#xff0c;printf()函数的调用格式为: printf("", )。3&#xff0c;格式输出&#xff0c;它是c语言中产生格式化输出的函…

语音增强相关技术综述

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;而在手机行业风生水起了…

android 滑动过程 触发,android 代码实现模拟用户点击、滑动等操作

/*** 模拟用户点击** param view 要触发操作的view* param x 相对于要操作view的左上角x轴偏移量* param y 相对于要操作view的左上角y轴偏移量*/private static void analogUserClick(View view, float x, float y) {if (view null) {return;}LogUtil.e(TAG_POINT, "正在…