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的更多相关文章

  1. construction const parameter问题 构造函数const引用参数问题

    工程在window下编译没有任何问题, 但是在linux(CentOS6)下编译就老是报错 C++ 编译器已升级到最新版 6.1.0 错误如下: In file included /bits/stl_ ...

  2. C++Primer学习——const

    Const int size = 512; 在编译的时候,编译器会把用到该变量的地方全部替换成对应的值. const&可以绑定字面值,所以当用常量引用绑定一个常量时,是否可以看成那个值在编译阶 ...

  3. c++ 11 游记 之 decltype constexpr

    title: c++ 11 游记 1 keyword :c++ 11 decltype constexpr 作者:titer1 zhangyu 出处:www.drysaltery.com 联系:130 ...

  4. C++11 constexpr使用

    C++11为了提高代码执行效率做了一些改善.这种改善之一就是:生成常量表达式,允许程序利用编译时的计算能力.假如你熟悉模板元编程,你将发现constexpr使这一切变得更加简单.constexpr使我 ...

  5. C++ constexpr类型说明符

    本系列文章由 @yhl_leo 出品,转载请注明出处. 文章链接: http://blog.csdn.net/yhl_leo/article/details/50864210 关键字 constexp ...

  6. 第8课 常量表达式(constexpr)

    一. const 和constexpr的区别 (一)修饰变量时,const为“运行期常量”,即运行期数据是只读的.而constexpr为“编译期”常量,这是const无法保证的.两者都是对象和函数接口 ...

  7. C++ constexpr

    1.constexpr 1.const与constexpr: const: 承若不改变这个值,主要用于说明接口,这样在把变量传入函数时就不必担心变量会在函数内被改变了,编译器负责确认并执行const的 ...

  8. constexpr:编译期与运行期之间的神秘关键字

    Scott Meyers在effective modern c++中提到“If there were an award for the most confusing new word in C++11 ...

  9. constexpr 的来龙去脉

    constexpr 是什么? 关键字 constexpr (constant expression) 是在 C++11 中引入的,并且在 C++14 中进行了优化. constexpr 和 const ...

  10. Google C++ Style Guide

    Background C++ is one of the main development languages used by many of Google's open-source project ...

随机推荐

  1. cisco ios 密码恢复

    如果没有break键,使用仿真软件模仿一个break 密码恢复请执行以下步骤 1. 关闭或断开路由器电源 2.开启路由器.在通电后的前30秒内按下break键(或通过仿真程序发送一个间断序列),来中断 ...

  2. [UnityShader]说厌了的遮挡显示

    首先是效果 这个其实有相当多的地方在说了,我就不嚼舌根了 大概原理:一个Shader两个Pass,第一个Pass不管深度,都渲染,但是不写入深度,第二个Pass几乎没有改动,因为后执行,会覆盖掉第一个 ...

  3. SAP 开具发票的抬头文本带到会计凭证上

    #需求 将开具发票的抬头文本带到会计凭证上.方便财务处理凭证,不然需要再去编辑凭证,容易遗忘. 达到的效果如图所示: #二代增强SDVFX001 事务码cmod分配增强 编写增强出口 代码如下: DA ...

  4. 炫酷 css实现水波纹

    携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第23天,点击查看活动详情 ui设计的元素有时候需要有一些动画效果,可以直接用css动画来实现. 实现一个中心圆向四周有水波纹的效果 ...

  5. 用例需注意的点-UI自动化

    记几条--用例注意事项:用例从功能里面转化而来,并且不能脱离业务(针对某一个页面功能\某一个流程业务,写一条用例:即将界面操作间接转化为代码去操作!)1用例要尽量独立,相互不影响!(单独一条都可运行) ...

  6. ASP.NET Core http请求内容过大, IIS服务器 返回 Request Too Long 解决方案

    1.修改web.config文件内容如下: <?xml version="1.0" encoding="utf-8"?> <configura ...

  7. 性能测试工具locust压测介绍

    官方文档:https://docs.locust.io/en/stable/index.html 1.初识locust Locust 完全基本 Python 编程语言,采用python 编写压测脚本, ...

  8. java ArrayList 原理

    概述 底层通过数组实现,所以 查询/更新效率很高,删除/增加跟位置相关,除未实现同步外和 Vector 大致相同 自动扩容,每次扩容大概 1.5 倍,扩容代价比较高尽量避免 实现了 RandomAcc ...

  9. 15. 测试环境部署-linux

    抽奖项目部署文档: 1.抽奖项目使用python3开发,python版本3.x都可以 需要安装的python第三方模块 pip install django==1.9.0 这个一定要加版本号 pip ...

  10. 1.Python3.5+Pyqt5+PyCharm+Opencv3.3+Qtdesigner开发环境配置

    一:Python3.3和Pyqt5的安装 注意:两个的版本一定要对应,一定要对应,一定要对应,重要的事情说三遍. 因为我自己的电脑是64位的,所以我下载的都是64位版本的,且都是3.5版本的:这两个一 ...