范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

为什么不建议函数有太多参数?

  记录一篇今天工作的思考。为什么不建议函数的有太多参数?
  今天做组内代码评审时,发现同事的代码有一个小问题,一个函数添加了一个参数后有了7个参数,而公司的编码规范要求,函数的参数不许超过6个。
  后来我就研究了一下,为啥不建议函数有太多参数呢?当然函数参数太多,不利于维护,学习成本比较高。除此之外,函数参数太多对性能也有一定的影响。 观察参数传递方式
  我做了一个实验,观察对含有6个、7个、8个参数的函数进行调用时,到底有哪些不同,测试代码如下: #include   void func6(int p1, int p2, int p3, int p4, int p5,            int p6) { }  void func7(int p1, int p2, int p3, int p4, int p5,            int p6, int p7) { }  void func8(int p1, int p2, int p3, int p4, int p5,            int p6, int p7, int p8) { }  int main() {     func6(1, 2, 3, 4, 5, 6);     func7(1, 2, 3, 4, 5, 6, 7);     func8(1, 2, 3, 4, 5, 6, 7, 8);     return 0; }
  我们查看汇编代码,来观察调用时如何传递参数。
  我们看一下func6的调用,全部通过寄存器传递。    0x00005555555551ce <+8>:     mov    r9d,0x6    0x00005555555551d4 <+14>:    mov    r8d,0x5    0x00005555555551da <+20>:    mov    ecx,0x4    0x00005555555551df <+25>:    mov    edx,0x3    0x00005555555551e4 <+30>:    mov    esi,0x2    0x00005555555551e9 <+35>:    mov    edi,0x1    0x00005555555551ee <+40>:    call   0x555555555169 
  我们看一下func7的调用,参数1~6通过寄存器,参数7通过堆栈传递。    0x00005555555551f3 <+45>:    push   0x7    0x00005555555551f5 <+47>:    mov    r9d,0x6    0x00005555555551fb <+53>:    mov    r8d,0x5    0x0000555555555201 <+59>:    mov    ecx,0x4    0x0000555555555206 <+64>:    mov    edx,0x3    0x000055555555520b <+69>:    mov    esi,0x2    0x0000555555555210 <+74>:    mov    edi,0x1    0x0000555555555215 <+79>:    call   0x555555555188 
  我们看一下func8的调用,参数16通过寄存器,参数78通过堆栈传递。    0x000055555555521e <+88>:    push   0x8    0x0000555555555220 <+90>:    push   0x7    0x0000555555555222 <+92>:    mov    r9d,0x6    0x0000555555555228 <+98>:    mov    r8d,0x5    0x000055555555522e <+104>:   mov    ecx,0x4    0x0000555555555233 <+109>:   mov    edx,0x3    0x0000555555555238 <+114>:   mov    esi,0x2    0x000055555555523d <+119>:   mov    edi,0x1    0x0000555555555242 <+124>:   call   0x5555555551a7 结论
  gcc编译器(gcc9),在x64环境下。函数调用时,前6个参数通过寄存器传递,超过6个后面的参数通过堆栈传递。而寄存器传递参数比堆栈传递效率高,所以建议函数参数不要超过6个。
  学习c++还是要学习一些汇编的,可以解决很多问题啊。
  最后,东北码农,全网同名,求关注、点赞、转发,谢谢~

拆不动这三个字,就让黄埔区就成为了重点发展区广州黄埔区再次迎来拆迁,这个字念成拆字,还是念成富字?近十年很多广州人说,黄埔区将是广州的下一个珠江新城,因为黄埔区很可能是下一个因为征收而暴富的区,造就一群千万富翁!广州142个没有子女!却是上千名孩子的妈妈,张佳梅校长您好她,没有子女,却是上千名孩子的妈妈。她,与孩子们毫无血缘关系,却倾其所有无私奉献。即使身患绝症,还是毅然将自己所得奖金全部用于山区孩子们身上。她就是张桂梅,一个1974年生于黑龙江广州22号线最快地铁车站亮相,连接大湾区,未来直通深圳东莞好消息,广州十八二十二号线已移交运营测试,22号线定位是时速160公里的地下高铁,实现从广州市中心城区20分钟到达广州南沙区,号称是大湾区最快地铁。22号线还明确在广州火车站设站,加价万元仍一机难求华为折叠屏手机开卖北京时间11月15日上午10点零8分,几经跳票的华为折叠屏手机MateX正式开售,虽然MateX的定价高达16999元,但仅仅在开售一分钟之后,华为官网上的MateX手机就显示已售升级5G问题汇总要换手机?更耗流量?眼看着国内5G热潮进行得如火如荼,很多朋友都在想要不要换5G套餐,有朋友问我说想用5G必须要换手机吗?会不会更耗流量,现在的5G套餐会不会用一两天流量就耗尽了,诸如此类的问题很多很华为P30仅需1184元移动电信新套餐来了随着5G手机逐渐开始占据手机市场的主要份额,市面上4G手机的价格开始逐步下探,即便是新推出的4G手机其价格与往期相比也有不小的跌幅。这两天中移动和中电信就同时推出了新的5G合约套餐三星全面阻击华为!1亿像素骁龙865三星韩国著名的大型跨国集团,我们现在熟知的三星手机只是三星集团业务之一,除此之外,三星集团的业务还包括电子产品,保险,机械,化学等。光在电子产品领域,三星就有手机,电脑,电视,相机花呗要接入征信记录了花呗要接入征信记录了花呗要记入个人征信了,快看看花呗还了没有。花呗目前已经有5亿用户,相当于三之一的中国人都在用,这么庞大的数量纳入征信是迟早的事儿。要知道与花呗类似的京东白条,微罚3亿!这家公司涉嫌垄断公牛集团27日发布公告称,公司于2021年9月27日收到浙江省市场监督管理局出具的行政处罚决定书(浙市监案20214号),公司违反了中华人民共和国反垄断法,被处2020年度中国境内导向标识公司Expograph视觉形象升级Expograph成立于1973年,是一家设计和生产室内外应用标牌,导示系统的企业。该公司位于法国巴黎郊区,为公司办公室酒店和餐厅艺术和文化机构零售商和活动提供创意技术可行性研究制图书出版公司DK视觉形象升级DK图书出版公司成立于1974年,愿景是创作既有视觉冲击力又包含信息丰富的图书,使读者能够理解每一个主题。现在的DK已经延伸到不同类型的出版,同时也尝试将内容以网络和数码的形式呈现
不做弹窗忍者,将选择权交回用户手里据上海市消费者权益保护委员会调查数据显示,在对600款手机APP广告行为进行分析测试,发现有58会弹出广告,其中69。7没有关闭键,可以说,网友苦弹窗广告久已。弹窗广告,诱惑分享套硬刚小米12,红米K50Pro携手天玑9000来袭,2999的售价真的香随着摩托罗拉首次带来骁龙8Gn1处理器之后,所有手机厂商压力相当大,毕竟2999的起售价并不是任何手机厂商可以做到的。不过各大手机厂商仍然在不断预热新机,小米12系列马上到来,而红汽车产销量持续增长来源人民网人民日报海外版本报北京12月10日电(记者徐佩玉)中国汽车工业协会10日发布数据显示,11月,全国汽车产销分别达到258。5万辆和252。2万辆,环比增长10。9和8。1精研科技2。25亿元收购瑞点精密向汽车业务板块深度延伸中证网讯(王珞)12月24日,精研科技(300709)股东大会审议通过关于收购常州瑞点精密科技有限公司100股权暨关联交易的议案。据介绍,为把握市场发展趋势,更好地推动公司的长期战到底是什么黑科技?自己开?自己找车位?自己停?什么车什么操作让董子健三脸问号搭载无人自主泊车功能的威马W6浑身全是黑科技高清智能摄像头2高清环视摄像头4毫米波雷达5超声波传感器12感知周围环境,开停柳家事百度百科闲来无事,百度了柳船只,秒懂百科的介绍如下IT教父柳船只,你不知道的11件事1他财富不及王健林千分之一,却是王健林最欣赏的人,企业家朋友圈,资产规模20000亿2他40岁放弃中科院笔记本电脑背包有哪些推荐?给各大笔记本厂商代工包的厂家名字叫泰格斯,现在它也生产自有品牌,你搜一下就知道了。另外头条上也有好多人推荐台湾产的包,90美刀,可以打对折,全包20来个兜,分门别类,质量也很好,特Java不掌握这些能叫精通嘛?GitHub星标115Java教程分享Java不掌握这些能叫精通嘛?基础部分接口与抽象类的区别。Java中的异常有哪几类。分别怎么使用。常用的集合类有哪些。比如List如何排序。ArrayList和LinkedList爱奇艺难解长视频困局绘图杨佳12月初的爱奇艺,本应风起洛阳等多部年度大戏的热播而备受业界关注,谁料率先登上热搜的,却是企业大规模裁员的消息。据业内人士透露,为扭转持续亏损状况,爱奇艺近期正对组织架构进从管理方式揭秘小米企业管理成功的秘诀小米的高速增长可以说是中国商界中的一个奇迹,去KPI化去中心化粉丝文化,这些都是小米在人力资源管理上的有些离经叛道的主张,那么小米又是怎样将这些奇谈怪论进行有机的整合的呢?扁平化管英特尔i512400F海外开卖盒装价约1400元据海外媒体Xanxogaming报道,英特尔酷睿i512400F已经在秘鲁上市销售,盒装税后售价899秘鲁新索尔,约合人民币1400元。如上图所示,英特尔酷睿i512400F附带了