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 ...
随机推荐
- SQL注入、XSS
参考视频 一.Sql注入的原因 用户输入的信息,拼接到程序中进行了执行. 一.使用Burpsuite,进行万能钥匙探索 二.使用sqlmap进行测试 三.SQL注入基础知识 Mysql 5.x数据结构 ...
- 快速构建用户xlwings环境
一.安装python python-3.8.3-amd64.exe 二.准备文件requirements.txt 内容如下 安装失败需要切换国内镜像源 numpy==1.22.1 openpyxl== ...
- vue实现图片上传且实时预览
<div class="up-img"> <div class="imgList"> <ul> <li v-for=& ...
- iOS ProtocolBuffer使用介绍
ProtocolBuffer 简介 Protocol Buffer 是google 的一种数据交换的格式 Protocol Buffer 和 XML.JSON一样都是结构数据序列化的工具,但它们的数据 ...
- unity工程多开Bat
%cd%:: 源路径set sourceDir=C:\Projects\XXX:: 目标路径set destDir=C:\Projects\XXX_Clone :: 如果目标路径不存在就创建if no ...
- Wordpress指定关键词手动添加链接
方法:网站后台->外观->编辑->找到functions.php文件 wp-content/themes/当前外观/functions.php 在当前外观的functions.php ...
- junit使用进阶
一.模拟http请求测试接口 新建一个controller @RestController public class AATestController { @GetMapping("/tes ...
- for/in 语句用于循环对象属性
for/in 语句用于循环对象属性. 循环中的代码每执行一次,就会对数组的元素或者对象的属性进行一次操作. JavaScript 支持不同类型的循环: for - 循环代码块一定的次数 for/in ...
- java.lang.UnsatisfiedLinkError:【Linux运行JAVA调用JNA重新,so,SO报错】
困扰了好半天,我自己新建的项目,包名什么的不一样,太TM坑了,必须要包名一样文件名一样
- Python爬取网页上想要的数据
1.源代码如下 from urllib.request import urlopen,Request import urllib.request import re from bs4 import B ...