首页 >事件 > > 正文

天天速看:c++函数参数和返回值

博客园 2023-05-19 17:24:22
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 其实就是一个函数对象,会在编译期展开成一个函数对象体。

上一篇:传艺科技(002866.SZ):公司钠离子电池可广泛应用在A00级车、储能等领域 视点 下一篇:最后一页
x
推荐阅读

天天速看:c++函数参数和返回值

2023-05-19

传艺科技(002866.SZ):公司钠离子电池可广泛应用在A00级车、储能等领域 视点

2023-05-19

意料之外、情理之中的曲线

2023-05-19

世界焦点!态度测量技术

2023-05-19

碧桂园摘得太原市3宗地块

2023-05-19

中国旅游日,跟着外滩街道侨联 “环保游一江一河、低碳行一街一路”-焦点资讯

2023-05-19

奥普光电董秘回复:公司子公司禹衡光学生产的光栅传感器可用于智能协作机器人、机械手、汽车智能激光雷达等领域_世界报资讯

2023-05-19

当前快播:青岛:“十百千万”行动计划集聚“最强大脑”

2023-05-19

当前热讯:昂达官网_昂达VX9892GB

2023-05-19

唯品会怎么申请退款_唯品会怎么申请退款

2023-05-19

敏华控股斥资2673.05万港元回购500万股股份|全球热门

2023-05-19

广西生物多样性丰富度居全国第3位 已建成自然保护地223个

2023-05-19

全球观热点:证监会:稳步提升北交所市场交易活跃度

2023-05-19

雅万高铁全线接触网一次送电成功_天天短讯

2023-05-19

休宁县: “共享停车”新模式 缓解城市停车难

2023-05-19

周家桥街道社区救助顾问是这样找到困难群众的……

2023-05-19

减轻群众看病就医负担 助力“三医”协同发展——国家医保局介绍推动医保高质量发展情况

2023-05-19

新页进销存免费版-最资讯

2023-05-19

南京市女子中等专业学校招生电话_南京市女子中等专业学校-环球今头条

2023-05-19

心脏支架后能做ct吗_40岁做心脏支架能活多久_当前热议

2023-05-19

宁波北仑农村商业银行股份有限公司新碶支行|世界即时

2023-05-19

当前速读:国家医保局:进一步落实异地就医结算 继续扩大覆盖范围

2023-05-19

全球热消息:储能行业深度分析_cnh

2023-05-19

男子半夜求医医生警告-热资讯

2023-05-18

人民走低,离岸人民币兑美元跌超500点

2023-05-18

钒钛股份接待湖北省中小企业金融服务中心有限公司等多家机构调研

2023-05-18

环球实时:中国星辰|揭秘北斗“母港”如何保障北斗卫星发射任务

2023-05-18

全球快报:拳皇冰女无限放影子_拳皇冰女

2023-05-18

全球观速讯丨杭州临平区拥秀名居人才共有产权房申请材料一览

2023-05-18

*ST深南: 2022年年度股东大会法律意见书

2023-05-18

什么叫高透网纱窗|热头条

2023-05-18

世界热消息:成交985套!哈尔滨市房展会展期过半,这些户型最受欢迎

2023-05-18

焦点快报!本田缤智对比丰田锋兰达,15万左右谁更适合日常代步?

2023-05-18

AOC 智能投影旗舰新品 K1S 正式官宣:6 月 1 日全网首发! 今日报

2023-05-18

每日时讯!石家庄市第三十五中学举行专业教师教案风采展

2023-05-18

【全球热闻】【昆明第二届融媒体网评大赛】中老铁路成为连接昆明和世界的“桥梁”

2023-05-18

隐藏针线方法图解大全_隐藏针线方法图解

2023-05-18

马云说京东算老几视频(马云再次预言京东必死)

2023-05-18

社会工作者中级实务历年真题(社会工作实务中级历年真题)

2023-05-18

深沉的意思解释_深沉的意思|全球短讯

2023-05-18

司法鉴定所收费标准 观焦点

2023-05-18

悟性超强的星座-世界最新

2023-05-18

天天快资讯丨杭州女童电梯坠亡案一审宣判:保姆获刑一年,缓刑两年

2023-05-18

大族激光:5月17日获融资买入1340.82万元,占当日流入资金比例11.18%|世界通讯

2023-05-18

激发收藏市场活力

2023-05-18

遇见你丨贺宗耀和他的电影博物馆-环球微动态

2023-05-18

资讯:马斯克确认不会卸任CEO 特斯拉股东大会释放哪些新信号?

2023-05-18

Web3 API平台Airstack完成700万美元融资-每日时讯

2023-05-18

天天头条:氢氧化银是沉淀吗_氢氧化银

2023-05-18

天天快消息!跨越760多年,居然能在上博追古人的“慢镜头纪录片”!太上头了,根本停不下来~

2023-05-18

时政Vlog丨机场接机直播前我们都在准备些啥?

2023-05-18

北京警方通报16岁学生伤人案 基本信息讲解 世界今亮点

2023-05-18

绵里藏针的出处_绵里藏针打一生肖

2023-05-18

国产红外线水平仪哪个牌子好 红外线水平仪哪个牌子好

2023-05-17

产业金融要回归产业本质 金融、科技、产业数字化节奏相辅相成

2023-05-17

国内期货夜盘开盘多数上涨,铁矿涨2.25%_全球报道

2023-05-17

2023高中毕业同学录留言简短 唯美经典毕业寄语

2023-05-17

今日蜻蜓英文发音_蜻蜓英语怎么读音发音

2023-05-17

斗地主开宝箱软件_斗地主开宝箱

2023-05-17

企业所得税季度申报表在哪里下载_企业所得税季度申报表如何报 环球快看

2023-05-17

郑商所调整纯碱期货质检项目及收费标准

2023-05-17

陈忠岳出席2023世界电信和信息社会日大会并发表主题演讲

2023-05-17

环球快资讯丨精准扶贫app官方版下载_精准扶贫app

2023-05-17

安泰科技筹码连续5期集中

2023-05-17

外交部评“特拉斯窜台”:过气政客刷存在感 快资讯

2023-05-17

科技让一片片茶叶成了“金叶子” 世界最新

2023-05-17

鞍山师范学院专科学校_鞍山师范学院专科 每日观点

2023-05-17

全球看点:上海:2023年培育不少于20个细分领域专业服务商 推动25万家中小企业上平台上云

2023-05-17

资讯推荐:上海:至2023年底累计培育创新型中小企业2万家以上、专精特新“小巨人”企业700家以上

2023-05-17

全球即时看!醉汉落水受伤 怀宁民警营救

2023-05-17

今年我省247848人报名参加高考

2023-05-17

今日韵达快递单号查询查单号 怎么看_教你认识韵达快递单并查询单号 环球今亮点

2023-05-17

热讯:五大医疗保健数据安全挑战和数据保护技巧

2023-05-17

【独家焦点】Pimco高管称债务上限担忧或导致某些美国国库券收益率升至10%

2023-05-17

助力学子走上职场,上海首个大学生求职能力实训营成功举办! 观热点

2023-05-17

环球观天下!“四川美食节2023”在日本东京成功举办

2023-05-17

多维度界分组织犯罪中的从犯与协助组织犯

2023-05-17

5月16日伦敦LME锌锭夜盘行情

2023-05-17

世界速讯:银行存款利率又降了,全部进入2时代,如临大敌?

2023-05-17

中材节能:5月16日融资买入998.64万元,融资融券余额1.56亿元-全球速看

2023-05-17

硫化金

2023-05-17

山水比德股吧东方财富网股吧官网

2023-05-17

最新资讯:今日寂静之地怪物长啥样_寂静之地怪物长什么样

2023-05-17

环球观察:岷江指环虫 新种

2023-05-17

冠军!必胜!必胜客见证辽篮夺冠之夜|世界快播报

2023-05-16

设义诊台、发宣传资料、送限油壶等小工具……青岛市第九届全民营养周正式启动-热推荐

2023-05-16

【聚看点】权力的游戏百度网盘资源_权力的游戏百度网盘

2023-05-16

大S以泄露隐私为由再对前夫提告,汪小菲悄悄出庭意外遗失护照_天天观焦点

2023-05-16

本周两名前雄狮队被其他 NFL 球队宣布裁减-全球百事通

2023-05-16

第一次工业革命时间是1780年吗_第一次工业革命时间是 天天速讯

2023-05-16

易极:5.16原油多空获利离场,每天收米!

2023-05-16

全球速看:5月16日期货软件走势图综述:沪镍期货主力跌3.06%

2023-05-16

被美媒曝“出卖俄军”,普里戈任回应:很可笑|环球热资讯

2023-05-16

最简式法_最简式_当前视点

2023-05-16

环球今日讯!橡皮泥手工制作教学_橡皮泥手工制作图片

2023-05-16

国防部:积极推动中新(西兰)两军关系继续向前发展

2023-05-16

三星Galaxy Z Fold5/Flip5爆7月26日发布,同时还有新款平板与手表 世界热闻

2023-05-16

新消息丨港股异动 | 合景泰富集团(01813)反弹逾4% 公司寻求债务重组及资产出售

2023-05-16

全球视点!1/2盎司梅花生肖银币价格(2023年05月16日)

2023-05-16

当前头条:俄罗斯旅游景点大全_俄罗斯旅游景点

2023-05-16