constexpr和const
const表示一个变量的值不能改变,这个值可以使运行期间得到的const int sz = get_size();
constexpr是提示编译器,该值可以在编译期间就计算出来,并进行替换,不用等到运行时计算,能够提升程序性能
constexpr的初衷就是,有些信息可以在编译期间进行利用,将能计算出来的都尽可能地计算出来,不必等到运行期间再计算
即,有些表达式和函数在编译期间就可以知道结果了
int sq(int N) {
return N * N;
}
const int N = 123;
const int SQ_N = sq(N);
对于该代码段,N是在编译时就知道的,所以为何不直接在编译期将sq(123)的结果直接计算出来并进行替换?
上面的代码在编译期间就可以替换为
const int N = 123;
const int SQ_N = 15129;
不必等到运行时再计算
constexpr int sq(int n)
{
return n * n;
}
int main()
{
constexpr int N = 123;
constexpr int N_SQ = sq(N); printf("%d %d\n", N, N_SQ);
}
给函数传入一个const常量,函数内部只依赖常量进行计算,那么整个函数就可以在编译期间进行提前的计算从而进行替换
该函数从传入的参数到中间的运算流程都是可以在编译期间确切知道的
为了提示编译器可以这样做,规定在这样的函数前添加constexpr关键字
编译器就会尽可能地进行计算
C++11版本还不够完善,限定带有constexpr的函数内部只能有一条return语句,不可包括一些逻辑判断之类的
C++14版本就完善了,只要函数内部是只依赖常量进行计算,不依赖运行时才能知道的东西,就可以通过编译
尽管添加了constexpr,该函数还是可以像普通函数一样使用,能利用的时候编译器会进行替换,不影响普通调用
成员函数,构造函数前是否可以加上该关键字?
参考链接
https://blog.csdn.net/weixin_44638957/article/details/103851863
constexpr和const的更多相关文章
- construction const parameter问题 构造函数const引用参数问题
工程在window下编译没有任何问题, 但是在linux(CentOS6)下编译就老是报错 C++ 编译器已升级到最新版 6.1.0 错误如下: In file included /bits/stl_ ...
- C++Primer学习——const
Const int size = 512; 在编译的时候,编译器会把用到该变量的地方全部替换成对应的值. const&可以绑定字面值,所以当用常量引用绑定一个常量时,是否可以看成那个值在编译阶 ...
- c++ 11 游记 之 decltype constexpr
title: c++ 11 游记 1 keyword :c++ 11 decltype constexpr 作者:titer1 zhangyu 出处:www.drysaltery.com 联系:130 ...
- C++11 constexpr使用
C++11为了提高代码执行效率做了一些改善.这种改善之一就是:生成常量表达式,允许程序利用编译时的计算能力.假如你熟悉模板元编程,你将发现constexpr使这一切变得更加简单.constexpr使我 ...
- C++ constexpr类型说明符
本系列文章由 @yhl_leo 出品,转载请注明出处. 文章链接: http://blog.csdn.net/yhl_leo/article/details/50864210 关键字 constexp ...
- 第8课 常量表达式(constexpr)
一. const 和constexpr的区别 (一)修饰变量时,const为“运行期常量”,即运行期数据是只读的.而constexpr为“编译期”常量,这是const无法保证的.两者都是对象和函数接口 ...
- C++ constexpr
1.constexpr 1.const与constexpr: const: 承若不改变这个值,主要用于说明接口,这样在把变量传入函数时就不必担心变量会在函数内被改变了,编译器负责确认并执行const的 ...
- constexpr:编译期与运行期之间的神秘关键字
Scott Meyers在effective modern c++中提到“If there were an award for the most confusing new word in C++11 ...
- constexpr 的来龙去脉
constexpr 是什么? 关键字 constexpr (constant expression) 是在 C++11 中引入的,并且在 C++14 中进行了优化. constexpr 和 const ...
- Google C++ Style Guide
Background C++ is one of the main development languages used by many of Google's open-source project ...
随机推荐
- 使用oledb读写excel出现“操作必须使用一个可更新的查询”的解决办法
使用oledb读写excel出现"操作必须使用一个可更新的查询"的解决办法 转自:http://www.cnblogs.com/Richinger/archive/2008/09/ ...
- nginx重启报错 nginx: [error] open() “/run/nginx.pid“ failed (2: No such file or directory)
原文: https://blog.csdn.net/CRMEB/article/details/120779362 nginx [error] open() "/usr/local/var/ ...
- 096_mulesoft with salesforce _01
https://docs.mulesoft.com/mule-runtime/3.5/connect-with-salesforce-example https://www.youtube.com/w ...
- 071_salesforce 页面自动检索匹配显示设置
通常我们会有需求:在搜索框中输入关键词,点击后面搜索,相关数据会显示在输入框的下面供选择,如下图 First I am assuming that you already have Static Re ...
- 利用context组件数据传递
react的数据传递 是从父级向子级传递的.通过props.如果是很多组件需要的数据,通过props传递会非常麻烦.这个时候可以使用context. context需要可以类似于store但是也不能滥 ...
- PHP的session文件包含与竞争
PHP的session文件包含与竞争 lamaper@qq.com lamaper - 博客园 (cnblogs.com) 一.什么是Session Session:在计算机中,尤其是在网络应用中,称 ...
- 批量添加esxi主机到Vcenter
1 连接vcenter Connect-VIServer -Protocol https -User 'administrator@vsphere.local' -Password 'Vcenter密 ...
- Selenium私房菜系列8 -- 玩转Selenium Server【OO】
本篇主要是想更进一步介绍Selenium Server的工作原理,这次我们从Selenium Server的交互模式开始. 在<第一个Selenium RC测试案例>中,我们以命令&quo ...
- 有道翻译-JS逆向-api调用
简单方法 -调用开源api 这个比较简单四行代码就可以搞定,先放代码: 1 import requests 2 while True: 3 input_data = input('请输入你要翻译的数据 ...
- vue学习之-----组件递归调用
1.关键点 2.父组件 <template> <div> <div class="btn-title"> <el-button @clic ...