const和constexpr进一步思考

前言:

        首先如果你对constexpr不了解,还是不太合适.

        这篇文章主要还写我自己在用constexpr遇到的一些疑问.

const比constexpr更加灵活

普通全局变量:

首先,一般的普通全局变量在程序的运行时进行初始化。具体地说,它们在程序进入main函数之前的启动阶段被初始化。也就是在编译期间不会确定值.

constexpr-编译时常量:

        一定是编译期确定变量的值.

constexpr-运行时常量:

        一定会报错,它只能编译期来确定值.

const-编译时常量:

        const int x = 5; // 编译时常量

const-运行时常量:

        const int y = time(nullptr);//正常运行!!

        //constexpr int y = time(nullptr);//报错!!

从上面看出,const比constexpr更加灵活!const既可以编译的时候来确定值,在不能编译时期确定的情况下,可以在运行时期确定变量的值.那么constexpr还有什么要引入的必要吗?

两者几乎不都等价了?

那么普通的全局变量是什么时候确定值?

拓展一下:

  • 普通全局变量在程序的运行时进行初始化。具体地说,它们在程序进入main函数之前的启动阶段被初始化。

const和constexpr几乎等价吗?

几乎等价,但是他又区别!

c++11,引入了constexpr想做的事,是在继承了const在编译期间的特性之后,增加一些功能!

而这个功能就是增加了对函数在编译期间确定值,也就是为什么这个关键字是const+expr组成,非常的贴切!

多说一句;expr的翻译就是表达式.c++中对于'表达式'这个词语的表达包括了变量和函数.

修饰变量的时候,constexpr几乎和const等价.都是编译期间对变量进行确定值.也就是constexpr中的const.

同时.在编译期间可以对函数确定值.也就是constexpr中的expr.

constexpr和const的作用域

普通全局变量:

        范围是所有的cpp文件,只要你加了extern就可以引用.

        非const全局变量具有外部链接。外部链接意味着这个变量在整个程序中是可见的。因此,如果在多个翻译单元中定义了相同名称的非const全局变量,链接器会检测到重复定义并报错。

const:

        范围只本cpp文件中.所以不同文件中相同的变量名不会造成重复.所以用extern引用就报错.

        const全局变量具有内部链接.每个翻译单元都有自己的独立副本,不会与其他翻译单元中的同名变量冲突。

constexpr:

        范围只本cpp文件中.所以不同文件中相同的变量名不会造成重复.

        这个同理const.

既然两者范围都是本文件,那么等同于加了static吗?

如果单纯从作用范围来看,是一样的.

但是static还有其他的属性,这些属性是要保留的.

比如修饰静态变量的时候,生命周期该怎么来就怎么来了.

如何在其他文件引用constexpr修饰的函数呢?

1:声明放在头文件,实现放在源文件

        不行!只能放在头文件中

2:直接放在头文件中实现(推荐)

        也可以直接在头文件中定义constexpr函数,以便编译器更好地进行内联优化。

        我在vs2017上试了,没问题.

// math.h
#ifndef MATH_H
#define MATH_H// 在头文件中定义 constexpr 函数
constexpr int factorial(int n) {return (n <= 1) ? 1 : (n * factorial(n - 1));
}#endif // MATH_H// main.cpp
#include <iostream>
#include "math.h"int main() {constexpr int fact5 = factorial(5); // 使用 constexpr 函数std::cout << "Factorial of 5: " << fact5 << std::endl;return 0;
}

如何在其他文件引用constexpr修饰的变量呢?

1:头文件中定义constexpr变量

        通常,如果你希望在多个翻译单元中使用同一个constexpr变量,最好将其定义在头文件中,并且通常使用inline关键字(c++17)来确保它具有外部链接且避免重复定义错误。

// config.h
#ifndef CONFIG_H
#define CONFIG_H// 在头文件中定义 inline constexpr 变量
inline constexpr int BUF_LEN = 100;#endif // CONFIG_H// main.cpp
#include <iostream>
#include "config.h"int main() {std::cout << "Buffer length: " << BUF_LEN << std::endl;return 0;
}

2:定义在源文件中,加extern,可能是不行的.

        为了在多个翻译单元中引用constexpr变量,应在头文件中使用inline constexpr进行定义.

        如果尝试用extern关键字声明constexpr变量,会导致编译错误,因为constexpr变量的默认行为是内部链接性,不能在另一个翻译单元中找到其定义。

c++17中引入inline的新特性

一般来说,我们在头文件中定义了变量,这个头文件被引用了多次,就会报'多重定义'的问题,

这个时候inline就可以解决这个问题.,使用inline关键字可以避免这种链接错误,因为它允许多个翻译单元共享同一个内联函数的副本。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/19383.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

IO系列(九) -什么是零拷贝

一、摘要 相信不少的网友&#xff0c;在很多的博客文章里面&#xff0c;已经见到过零拷贝这个词&#xff0c;会不禁的发出一些疑问&#xff0c;什么是零拷贝&#xff1f; 从字面上我们很容易理解出&#xff0c;零拷贝包含两个意思&#xff1a; 拷贝&#xff1a;就是指数据从…

视频汇聚EasyCVR视频监控平台GA/T 1400协议特点及应用领域解析

GA/T 1400协议&#xff0c;也被称为视图库标准&#xff0c;全称为《公安视频图像信息应用系统》。这一标准在公安系统中具有举足轻重的地位&#xff0c;它详细规定了公安视频图像信息应用系统的设计原则、系统结构、视频图像信息对象、统一标识编码、系统功能、系统性能、接口协…

探索RS与AES加密技术:从经典到现代

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、MD5加密技术&#xff1a;经典中的经典 二、非对称加密&#xff1a;RSA技术的魅力 RSA技…

小型水库水雨情和大坝安全监测解决方案

小型水库水雨情和大坝安全监测解决方案 小型水库作为重要的水资源管理和防洪调蓄设施&#xff0c;在保障农业灌溉、居民饮水及防洪安全方面发挥着不可或缺的作用。然而&#xff0c;由于其规模限制&#xff0c;小型水库往往在水雨情监测和大坝安全评估方面面临资源和技术的双重…

力扣爆刷第146天之贪心算法五连刷

力扣爆刷第146天之贪心算法五连刷 文章目录 力扣爆刷第146天之贪心算法五连刷总结一、455. 分发饼干二、376. 摆动序列三、53. 最大子数组和四、122. 买卖股票的最佳时机 II五、5. 跳跃游戏 总结 贪心算法的本质就是选择每一阶段的局部最优&#xff0c;从而达到全局最优。 一…

Day27

Day27 反射案例 案例一&#xff1a;万能数组扩容 注意&#xff1a;copyOf、toString public class Test01 {/*** 知识点&#xff1a;反射案例 之 万能数组扩容* * 注意&#xff1a;copyOf、toString*/public static void main(String[] args) {String[] ss {"aaa"…

【入门】使用sklearn实现的KNN算法:鸢尾花数据集分类预测

目录 前言 第一步&#xff1a;安装和导入sklean模块 第二步&#xff1a;获取数据 第二步&#xff1a;分割出训练集和测试集 第三步&#xff1a;训练模型 第四步&#xff1a;测试结果 总结 前言 本文将介绍如何利用K最近邻&#xff08;KNN&#xff09;算法对经典的鸢尾花数…

关于网络的基础知识

大家好&#xff0c;在当今数字时代&#xff0c;网络已经成为我们生活中不可或缺的一部分&#xff0c;它连接着世界的每一个角落&#xff0c;让信息、资源和人们彼此之间无阻碍地交流和共享。然而&#xff0c;对于许多人来说&#xff0c;网络仍然是一个神秘而复杂的领域&#xf…

Linux基础指令用户管理003

继Linux基础指令002我们讲了如何设置用户密码以及修改用户信息&#xff0c;我们讲一下高级用户管理。 操作系统 CentOS Stream 9 高级用户管理 visudo 用于普通用户临时提升权限执行命令&#xff0c;如下图 [yylocalhost ~]$ cp -av /etc/passwd{,_bak} /etc/passwd ->…

数据分析必备:一步步教你如何用Pandas做数据分析(11)

1、Pandas 自定义选项 Pandas 自定义选项操作实例 Pandas因为提供了API来自定义行为&#xff0c;所以被广泛使用。 自定义API中有五个相关功如下&#xff1a; get_option() set_option() reset_option() describe_option() option_context() 下面我们一起了解下这些方法。 1.…

【leetcode--删除有序数组中的重复项I + II】

删除有序数组中的重复项I 给你一个 非严格递增排列 的数组 nums &#xff0c;请你 原地 删除重复出现的元素&#xff0c;使每个元素 只出现一次 &#xff0c;返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数。 思路&#xff1a;双指…

STM32_HAL_低功耗的模式

低功耗的模式 运行模式&#xff08;Run Mode&#xff09;&#xff1a;这是正常工作模式&#xff0c;所有的系统功能都是可用的。 睡眠模式&#xff08;Sleep Mode&#xff09;&#xff1a;在CPU停止运行时&#xff0c;所有的外设和内存仍然处于供电状态。此模式下&#xff0c;…

卓豪Zoho CRM客户管理系统采购费用?

企业如何高效地管理客户关系&#xff0c;卓豪Zoho CRM&#xff0c;作为一款领先的客户关系管理系统&#xff0c;不仅为企业提供了一套完整的客户管理解决方案&#xff0c;更在价格上实现了公开透明和合理优惠&#xff0c;助力企业实现数字化转型&#xff0c;迈向更高效、更智能…

前端 CSS 经典:filter 滤镜

前言&#xff1a;什么叫滤镜呢&#xff0c;就是把元素里的像素点通过一套算法转换成新的像素点&#xff0c;这就叫滤镜。而算法有 drop-shadow、blur、contrast、grayscale、hue-rotate 等。我们可以通过这些算法实现一些常见的 css 样式。 1. drop-shadow 图片阴影 可以用来…

电压、电流、功率

//**********************************************************************************// 380V电压 额定功率1.732*额定电压*额定电流*功率因素 220V电压 额定功率额定电压*额定电流*功率因素 单相&#xff0c;功率1KW&#xff0c;电流约4.5A。 三相&#xff0c;功率1KW…

使用Java Swing制作一个飞翔的小鸟游戏

文章目录 一、需求分析二、技术介绍2.1相关技术2.2开发环境 三、功能实现1、开始2、运动3、死亡 四、部分代码实现获取源码 文章最下方获取源码&#xff01;&#xff01;&#xff01; 文章最下方获取源码&#xff01;&#xff01;&#xff01; 文章最下方获取源码&#xff01;&…

基于Vue的神影视频APP

需求说明:使用Vue脚手架进行搭建,页面简洁、精致,和一些常见的电影网站类似,例如支付宝中的“淘票票电影”。在项目中使用页面布局技术(表格,vue.js框架,DIV+CSS或者混合使用)进行页面设计,使网站功能齐全,界面美观大方,有一定的交互性。 功能分析:系统主要分为七…

十大排序算法【1】---冒泡排序、快速排序、选择排序、插入排序、希尔排序

动画演示 各种算法&#xff1a;https://www.cs.usfca.edu/~galles/visualization/Algorithms.html 6种常见排序算法&#xff1a;https://www.cs.usfca.edu/~galles/visualization/ComparisonSort.html 1、冒泡排序 //1、冒泡排序Bubble Sort: 比较前后相邻的数据&#xff0c…

消消乐游戏开发,三消游戏,消除小游戏

消消乐是一款非常受欢迎的休闲消除类游戏&#xff0c;通常也被称为“三消游戏”。这类游戏的主要目标是通过交换和匹配三个或更多相同的物品来清除它们&#xff0c;从而得分并通过关卡。以下是一些消消乐游戏的基本特点和玩法&#xff1a; 基本玩法 交换和匹配&#xff1a;玩…