宏可以转变成constexpr_现代C++概览(三) 使用constexpr进行极致代码优化

首先来看一段代码:

80f7efcd62b83263a4eed71177d3ef2a.png

这是一段很简单的代码,使用函数fib递归求一个数(20)的斐波那契值,并以结果在main函数中进行返回。

关于如何优化这个函数,相信网上有相当多的讨论,比如消除递归等等吧,但是就这段代码而言,我们对其进行编译,使用编译自带的最强优化:O3,那么我们可以得到的优化后的汇编代码:

$ clang -S -std=c++14 -O3 *.cpp

53a849ea19fd60d58c0f51adc5340f52.png

不错,编译后的汇编代码26行,相对已经很精简了,如果关闭优化(-O0)得到大约42的汇编代码,如果使用gcc编译的话,即使开启O3优化,也还是有250行的汇编代码,由此可见clang对C++进行非常好的编译优化能力。

然而针对上面的代码,我们还有其它的优化手段吗?当然,肯定是有的!下面我们对之前的代码稍微改变一下,如下所示:

475602f4a8d703db9f6c06a4373af3e8.png

然后在编译选项中加入 "-DUSE_CONSTEXPR",意思是定义宏USE_CONSTEXPR,下面是所用的编译命令:

clang -S -std=c++14 -O3 -DUSE_CONSTEXPR *.cpp

编译过的汇编代码如下:

5600bf062b8ac6ade515017189d571dd.png

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

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

4dd792aac960c26624dc1fd14c4e1151.png
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值