c++函数参数和返回值
2023-05-19 17:41:27 来源:博客园
c++函数参数和返回值函数存储位置函数参数入栈顺序初始化列表函数的返回值用参数引用来返回返回一个参数指针返回一个对象总结函数的几种变体inline 函数函数对象lambda 函数c++函数参数和返回值

c++一直以来是一个关注效率的代码,这样关于函数的参数传递和返回值的接收,是重中之重。下文提供了一些个人的见解。


(资料图片仅供参考)

函数存储位置

函数参数在编译期展开,目前各平台的编译期均有不同。

名称存储位置
函数名称和逻辑代码段存储
函数参数和返回值栈中或者寄存器(64位会有6个寄存器使用)
new malloc 的变量
函数参数入栈顺序

微软有几种编译期属性,用来定义函数参数的顺序和堆栈。

关键字堆栈清理参数传递
__cdecl调用方在堆栈上按相反顺序推送参数(从右到左)
__clrcall不适用按顺序将参数加载到 CLR 表达式堆栈上(从左到右)。
__stdcall被调用方在堆栈上按相反顺序推送参数(从右到左)
__fastcall被调用方存储在寄存器中,然后在堆栈上推送
__thiscall被调用方在堆栈上推送;存储在 ECX 中的 this 指针
__vectorcall被调用方存储在寄存器中,然后按相反顺序在堆栈上推送(从右到左)

所以直接在函数参数上,调用表达式和函数来回去值的话,非常危险

初始化列表
class Init1{public:    void Print()    {        std::cout << a << std::endl;        std::cout << b << std::endl;        std::cout << c << std::endl;    }    int c, a, b;};

A这个类,可以通过 A a{1,2,3}; 来初始化对象。看着很美好,但是有几个问题需要注意。参数是的入栈顺序是跟着类的属性的顺序一致, 当前是 c, a, b;

int i = 0;Init1 a = {i++, i++, i++};a.Print();

当我如此调用的时候,得到的返回值是 1 2 0i++的执行顺序是从左到右,跟函数调用顺序无关。 另外不能有 构造函数

class Init1{public:Init1(int ia, int ib, int ic){std::cout << "construct" << std::endl;a = ia;b = ib;c = ic;}Init1(const Init1& other){std::cout << "copy " << std::endl;a = other.a;b = other.b;c = other.c;}void Print(){std::cout << a << std::endl;std::cout << b << std::endl;std::cout << c << std::endl;}int c, a, b;};

当我添加了构造函数的时候。 用下面代码测试。会得到两种结果

void Test_InitilizeList(){int i = 0;//Init1 a = { i++, i++, i++ }; // 0 1 2 Init1 a(i++, i++, i++); // 2 1 0 a.Print();}
函数的返回值

函数返回值的声明周期在函数体内。

用参数引用来返回
class Result{public:int result;};void GetResult(Result& result) ...

优点:

效率最高,因为返回值的对象在函数体外构造,可以一直套用, 可以一处构造,一直使用。安全,可以定义对象,并不用new或者malloc, 没有野指针困扰。缺点:代码可读性低,不够优美无法返回nullptr. 一般在 Result 中定义一个; 用来表示一个空对象。容易赋值到一个临时对象中,当调用GetResult({1})会赋值到一个 临时的 Result 对象中,拿不到返回值。正常来说也不会这样做。返回一个参数指针
class Result{public:int result;};Result* GetResult() ...

优点:

简洁明了参数传递快速缺点:指针如果在 函数内 static 需要考虑多线程。 如果是 new 出来的,多次调用效率不高指针无法重复使用,(可以用 std::share_ptr 增加对象池来解决问题。但会引入新的复杂度。)需要考虑释放的问题返回一个对象
class Result{public:int result;};Result GetResult() ...

优点:

没有内存泄露的风险简洁明了缺点:但有个别编译期优化选项问题,会导致一次构造两次拷贝, 第一次是函数体内对象向返回值拷贝,第二次是 返回值拷贝给外面接收参数的。开启编译期优化选项,并且是 在 return Result 的时候构造返回对象,才能优化。总结

一般如果是 简单结构体,用 返回一个临时对象的方式解决。如果使用 返回一个参数指针,一般改成返回一个id,用一个manager来管理内存机制。或者 共享内存,内存池来解决内存泄露后续的问题用 参数引用来返回的话,一般会这么定义 int GetResult(Result& result) 函数返回值,用来返回状态码,真正的数据,放到 result 中。

函数的几种变体inline 函数inline 函数是内联函数,是编译期优化的一种手段,一般是直接展开到调用者代码里,减少函数堆栈的开销。inline 标识只是建议,并不是一定开启内联。函数比较复杂或者递归有可能编译期不展开。dll 导出的时候,可以不用加导出标识,会直接导出到目标处。inline 在msvc的平台,只要实现头文件中,加不加内联是一样的. (警告顶级调到最高/Wall, 不加inline标识的函数会提示,未使用的内联函数将被删除。)inline 函数比全局函数更快,但是全局函数无法定义在头文件中(会报多重定义函数。)所以一般用class 包一层 static inline 函数,用来写工具类。函数对象
class A {public :    int value;      int operator() (int val) {        return value + val;    }}

上述代码是一个函数对象,重载operator()得到一个函数对象。int a = A{10}(1)会返回11, 显示构造了一个A{value=10}的对象,然后调用重载函数operator(), 返回 10 + 1 = 11上述代码因为是在头文件实现的,所以编译期会自动把operator()函数当成inline函数,执行效率很高。

lambda 函数

lambda 其实就是一个函数对象,会在编译期展开成一个函数对象体。

c++函数参数和返回值

2023-05-19

长江东路小学教育集团举行课题开题报告会暨课题专题培训

2023-05-19

帝王蟹腿配什么菜_送妈妈的生日礼物什么好 全球热议

2023-05-19

焦点!17宗地上架、总起拍价超495亿 北京6月即将迎来土拍大战

2023-05-19

如何报考心理咨询师

2023-05-19

张春军个人资料和图片_张春军最新篮球明星动态|环球新视野

2023-05-19

世界新动态:大和:重申中通快递-W“买入”评级 目标价升至330港元

2023-05-19

城投随笔系列:贵阳和呼市 道出化债心声|环球简讯

2023-05-19

V观话题丨为何如今热衷打卡“网红景点”?你被网红景点“照骗”过吗?

2023-05-19

天天快讯:雪居之地眯眼狐容错怎么样

2023-05-19

全球观察:你想知道的《速激10》彩蛋都在这里了

2023-05-19

东西歌曲(东西歌词)-全球百事通

2023-05-19

内蒙古包头纵向通道加强(英华至包北)双回500千伏线路工程开工

2023-05-19

骁龙 778G 小折叠 华为 Pocket S 官方降价千元:4988 元起 热点评

2023-05-19

新资讯:散户3年亏赚570万超短线

2023-05-19

世界信息:聚焦!长春新区技改扩能项目最新动态

2023-05-19

全球快讯:“以赛引才” 这个全国高校科技创新大赛开启招聘新模式

2023-05-19

罗马塞维利亚会师欧联决赛:射门1-23晋级穆帅封神 尤文惨遭逆转-环球时讯

2023-05-19

“风”驰“电”掣势如虹

2023-05-19

乡村爱情第十三部第二十二集 小雷和秀英第五部 天天聚看点

2023-05-19

西游记第十一回概括一句话_西游记第十一回概括

2023-05-19

张裕大香槟怎么开_香槟怎么开_热点评

2023-05-19

全球看热讯:中国首次进行太空行走的是_我国首次完成太空行走任务的是

2023-05-18

500亿元产业小镇规划仅需3周 萧山如何“马上办”? 天天观焦点

2023-05-18

高质量发展调研行丨江苏常州:打造“创新之核” 塑造第一动力|百事通

2023-05-18

家具发白霉处理小妙招 家具发白色霉怎么处理

2023-05-18

天津2023幼儿园报名材料

2023-05-18

智能让城市更生动 第七届世界智能大会等你来体会

2023-05-18

泰鸿万立IPO:营收15亿八成多靠长城、吉利,应正才父子控股37%_前沿资讯

2023-05-18

全球消息!本月将发射神舟十六号载人飞船

2023-05-18

新能源汽车产业加快技术突破 成为稳工业重要力量

2023-05-18

委内瑞拉“融入进程”!拉美国家“去美元化”动作不断|世界观热点

2023-05-18

全球微速讯:脖子扭筋了怎么办_脖子扭筋了怎么办

2023-05-18

“祝融号”又有新发现!我国科学家研究证明火星北部曾存在海洋 天天新动态

2023-05-18

比停产还难受!合资中大型SUV从26万降至18万,路上比库里南稀罕 今日最新

2023-05-18

YSC陶瓷吹风机X浪姐张嘉倪亮相《花花宝贝的派对》

2023-05-18

世界看热讯:微信分付使用方法_微信分付使用技巧

2023-05-18

河北新乐:“订单式”培养促就业

2023-05-18

天天要闻:重要货币市场基金监管新规落地 专家:市场安全性将大幅提高

2023-05-18

焦点!隆达股份:5月17日融券卖出4044股,融资融券余额9404.35万元

2023-05-18

每日热闻!《暗黑破坏神4》实机片段上市预告片公布

2023-05-18

不好用?统计发现逃离安卓换苹果iPhone的人一下子变多了|环球今亮点

2023-05-18

动态焦点:新媒体编辑面试会问什么问题_新媒体运营面试会问一些什么问题

2023-05-18

过氧乙酸适用于哪种_过氧乙酸的用途是什么简介介绍

2023-05-18

俄媒:俄印恢复卢比结算贸易 俄方正用国库多余卢比买印度货|焦点快看

2023-05-17

焦点速读:哈兰德、本泽马数据对比:每90分钟进球1.29比0.77,触球26比58

2023-05-17

今日快讯:英媒:未来五年全球气温升幅突破1.5℃的可能性升至66%

2023-05-17

老街里,文艺范

2023-05-17

上海琉璃艺术博物馆首度与国内青年艺术家合作 挑战玻璃的“柔软”|快播

2023-05-17

天天头条:北京新冠病例连续2周超流感 这就很离谱了

2023-05-17

要闻:美克家居惨遭“戴维”双杀 公司回购、实际控人连续增持难解股价颓势

2023-05-17

当前热议!延吉市学前教育第二大园区开展系列现场会

2023-05-17

视频 | 2022年度四川省博物馆“十佳文博短视频”揭晓-观速讯

2023-05-17

Fly再次夺得MVP,清融却爆出大瓜!与狼队要即将接轨 焦点要闻

2023-05-17

最智能的机器人美女(全智能美女机器人老婆)|天天微资讯

2023-05-17

国家发改委:继续加大制造业中长期贷款投放力度,扩大工业和技术改造投资 全球滚动

2023-05-17

“海绵”让城市更有弹性

2023-05-17

浪姐张含韵代言《我的御剑日记》5月18公测 200万预约达成_世界观热点

2023-05-17

《中国语言文化典藏·宾阳》新书发布 多角度呈现宾阳方言文化实态样貌-环球速讯

2023-05-17

世界最资讯丨半马苏河·夏之交响|上海市首创, 普陀实现 “一业一证”云上帮办

2023-05-17

内蒙古开展防洪隐患排查保安全度汛

2023-05-17

年内A股定增募资额同比增近九成

2023-05-17

天天看热讯:宁德时代将推出凝聚态电池的车规级应用版本;天然钻石或涨价丨明日主题前瞻

2023-05-17

胃胀气吃什么药最好见效快便秘(胃胀气吃什么药最好)|头条焦点

2023-05-17

外网ip大全(外网ip查询) 热头条

2023-05-16

“吃虾自由”要来了!小龙虾大量上市 价格降幅20%-30%_今亮点

2023-05-16

没有碱红酒怎么分辨真假?

2023-05-16

芹菜生吃能吗(芹菜生吃对身体有害吗)|环球讯息

2023-05-16

连衣裙过时了,今年流行高腰的“运动裙”,小个子穿既优雅又显高

2023-05-16

每日快播:同行上险量造假?李想又在含沙射影谁?

2023-05-16

2022年居民膳食抽样调查显示:杭州人对于吃太“专一”

2023-05-16

iPhone 15不值得等了!iPhone16 Pro Max升级苹果史上最大屏|当前热闻

2023-05-16

百度发布2023年Q1财报:营收311亿元,净利润大幅增长48%

2023-05-16

智通AH统计|5月16日_看热讯

2023-05-16

焦点报道:海保人寿保险公司客服电话是多少?

2023-05-16

冬季安全小知识顺口溜_冬季安全小知识

2023-05-16

微资讯!“最吸金专业”?没必要被眼前的风光一叶障目

2023-05-16

你看过最“沙雕”的新闻是什么?-今日播报

2023-05-16

联想手机逆市增长:摩托罗拉立大功,在欧洲、拉美地区爆火!_环球速读

2023-05-16

国家统计局:相关部门正积极出台政策帮扶青年人就业难问题

2023-05-16

雪榕生物:雪榕源自设立以来,始终保持与相关科研机构、团队的交流,并开展合作-当前快报

2023-05-16

每日速看!国家统计局:4月份房地产开发景气指数为94.78

2023-05-16

河北完成首票跨境电商出口海外仓无纸化备案

2023-05-16

6只股票型ETF份额增加超2亿份,华夏上证科创板50成份ETF增加6.71亿份|环球新动态

2023-05-16

当前快看:协同是针,创新是线!京津冀地区生产总值突破10万亿

2023-05-16

omoani视频(omoani)|每日速读

2023-05-16

惠普笔记本摄像头驱动名称_惠普笔记本摄像头驱动 每日热门

2023-05-16

杭州四季星座批发网官网_杭州四季星座批发网|每日消息

2023-05-16

【乐游·经开】山东芊向荣采摘园:一树成熟,满园飘香

2023-05-16

热头条丨县县有集群 一产一特色 ——河北县域特色产业集群扫描

2023-05-16

【积分榜|09/10意甲】国米斩意甲拿下三冠王,你对这赛季有何印象

2023-05-15

优化“阶梯制” 蓄好“人才池”

2023-05-15

全球今亮点!“中说超”顶级竞技场回归,中文说唱名人堂再排座次

2023-05-15

百度股票代码是多少中国大陆,百度股票叫什么名字

2023-05-15

从达利食品,探究中国品牌成长的力量

2023-05-15

焦点播报:吉林辖区开展“5·15全国投资者保护宣传日” 及防范非法证券期货宣传活动

2023-05-15

今日最新!中小投服中心董事长夏建亭:不断探索创新投资者保护重要实践

2023-05-15

央行发布一季度中国货币政策执行报告

2023-05-15

当前看点!黄金8公里:环太湖一体化再升级

2023-05-15

阿里达摩院自动驾驶团队并入菜鸟集团 快递行业面临新机遇

2023-05-15