const 与 constexpr 、及 costexpr 与 inline 函数的区别

(部分内容转载知乎某大牛的回答https://www.zhihu.com/question/35614219)

 (一)对于修饰Object来说,

const并未区分出编译期常量和运行期常量
constexpr限定在了编译期常量

目的:  提高效率。因为编译器知道这是一个常量,所以可以优化代码,比如整个 function 全部优化掉。

(二)对于修饰的函数来说

#include <iostream>
#include <array>
using namespace std;

constexpr int foo(int i)
{
    return i + 5;
}

int main()
{
    int i = 10;
    std::array<int, foo(5)> arr; // OK
    
    foo(i); // Call is Ok
    
    // But...
    std::array<int, foo(i)> arr1; // Error
   
}

然后我想对修饰函数多说两句,那就是constexpr修饰的函数, 返回值不一定是编译期常量。#It is not a bug, it is a feature.#

对于constexpr修饰的函数

   if( 传入的参数可以在编译时期计算出来 )

           那么这个函数就会产生编译时期的值

else

            那么constexpr修饰的函数就和普通函数一样了。


我们不必因此而写两个版本,所以如果函数体适用于constexpr函数的条件,可以尽量加上constexpr。


检测constexpr函数是否产生编译时期值的方法:

    就是利用std::array需要编译期常值才能编译通过的小技巧。这样的话,即可检测你所写的函数是否真的产生编译期常值了。

 

内联函数与constexpr的区别

inline函数  —— 在编译期 将所有inline修饰的函数替换为   整个代码。(可以想象为复制粘贴,很像宏替换但却不是宏替换)

                                                                                                          (当然编译器会去判断这个能不能作为 inline  函数) 

constexpr  —— 在编译期算出来constexpr 所修饰的函数的值 ——> 运行期调用函数时,用编译期算出来的值进行替换。

                                                                                                        (当然编译器会去判断这个能不能作为 constexpr  函数)




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值