首发于 游戏与引擎

使用constexpr进行极致代码优化

首先来看一段代码:


这是一段很简单的代码,使用函数fib递归求一个数(20)的斐波那契值,并以结果在main函数中进行返回。
关于如何优化这个函数,相信网上有相当多的讨论,比如消除递归等等吧,但是就这段代码而言,我们对其进行编译,使用编译自带的最强优化:O3,那么我们可以得到的优化后的汇编代码:
$ clang -S -std=c++14 -O3 *.cpp


不错,编译后的汇编代码26行,相对已经很精简了,如果关闭优化(-O0)得到大约42的汇编代码,如果使用gcc编译的话,即使开启O3优化,也还是有250行的汇编代码,由此可见clang对C++进行非常好的编译优化能力。
然而针对上面的代码,我们还有其它的优化手段吗?当然,肯定是有的!下面我们对之前的代码稍微改变一下,如下所示:


然后在编译选项中加入 "-DUSE_CONSTEXPR",意思是定义宏USE_CONSTEXPR,下面是所用的编译命令:
clang -S -std=c++14 -O3 -DUSE_CONSTEXPR *.cpp
编译过的汇编代码如下:


现在的汇编代码仅仅只有3行,是不是很不可思议!


这里的关键是constexpr。该关键字在C++11中引入,在C++14中进行了改进,并使其可以支持多行函数,它表示常量表达式。与const一样,它也可以应用于变量,以便在任何代码试图修改该值时引发编译器错误。与const不同,constexpr还可以应用于函数和类构造函数。constexpr表示该值(或返回值)是常量,如果可能,会在“编译时”计算。

代做工资流水公司临沂工作收入证明费用常州代办工作收入证明哈尔滨打日常消费流水泰州企业对公流水价格湛江制作工资代付流水扬州代开工资流水账单杭州背调工资流水模板南阳对公银行流水模板南京企业对私流水代办大庆打印在职证明济南代办背调银行流水三亚办理银行流水电子版湛江企业对公流水代开长沙入职银行流水代做银川流水账单办理荆州做背调工资流水厦门薪资流水单费用三亚购房银行流水石家庄银行对公流水代办绵阳背调流水制作扬州企业贷流水公司淮安公司流水三亚企业贷流水代办舟山查询银行流水PS黄冈公司银行流水代办兰州购房银行流水查询杭州企业流水打印价格西安代做薪资流水海口签证流水济南对公银行流水报价香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声卫健委通报少年有偿捐血浆16次猝死汪小菲曝离婚始末何赛飞追着代拍打雅江山火三名扑火人员牺牲系谣言男子被猫抓伤后确诊“猫抓病”周杰伦一审败诉网易中国拥有亿元资产的家庭达13.3万户315晚会后胖东来又人满为患了高校汽车撞人致3死16伤 司机系学生张家界的山上“长”满了韩国人?张立群任西安交通大学校长手机成瘾是影响睡眠质量重要因素网友洛杉矶偶遇贾玲“重生之我在北大当嫡校长”单亲妈妈陷入热恋 14岁儿子报警倪萍分享减重40斤方法杨倩无缘巴黎奥运考生莫言也上北大硕士复试名单了许家印被限制高消费奥巴马现身唐宁街 黑色着装引猜测专访95后高颜值猪保姆男孩8年未见母亲被告知被遗忘七年后宇文玥被薅头发捞上岸郑州一火锅店爆改成麻辣烫店西双版纳热带植物园回应蜉蝣大爆发沉迷短剧的人就像掉进了杀猪盘当地回应沈阳致3死车祸车主疑毒驾开除党籍5年后 原水城县长再被查凯特王妃现身!外出购物视频曝光初中生遭15人围殴自卫刺伤3人判无罪事业单位女子向同事水杯投不明物质男子被流浪猫绊倒 投喂者赔24万外国人感慨凌晨的中国很安全路边卖淀粉肠阿姨主动出示声明书胖东来员工每周单休无小长假王树国卸任西安交大校长 师生送别小米汽车超级工厂正式揭幕黑马情侣提车了妈妈回应孩子在校撞护栏坠楼校方回应护栏损坏小学生课间坠楼房客欠租失踪 房东直发愁专家建议不必谈骨泥色变老人退休金被冒领16年 金额超20万西藏招商引资投资者子女可当地高考特朗普无法缴纳4.54亿美元罚金浙江一高校内汽车冲撞行人 多人受伤

代做工资流水公司 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化