当前位置: 首页 > news >正文

(C++20) constinit常量初始化

文章目录

  • 由来
  • constinit 常量初始化
    • 常量初始化 != 初始化常量
    • 初始化声明静态存储对象
    • 非初始化声明thread_local
  • END

由来

在C++多文件编译中会出现一个常见的问题,叫做静态初始化顺序问题。Static Initialization Order Fiasco

比如现在有两个文件,其中都有一个全局变量。

// file1.cpp
int x = 10;// file2.cpp
int y = 20;

由于多文件编译顺序等一些列问题,可能又有第三个或者更多对象对这两个有了依赖,就会出现一些列意想不到的问题。

通常解决方案是使用函数内部的局部静态变量Locia Static,来解决该问题,因为C++保证了局部静态变量只有在第一次调用到的时候才初始化,这也是著名设计模式,单例模式中最常用的一个技巧。

而要正面应对这个问题就需要C++20中的constinit

constinit 常量初始化

constinit 说明符 (C++20 起) - cppreference.com

常量初始化 != 初始化常量

请务必理解下面的区别

// 这是`初始化一个常量`
constexpr int x = 10;// 这是`常量初始化`
constinit int y = 20;int main() {// 不能修改一个常量// error: assignment of read-only variable 'x'// x = 100;// oky = 200;
}

就是说常量初始化是在编译期间确定初始值。而对象本身的读写性质不受影响。

初始化声明静态存储对象

constinit 可以针对具有静态存储方式的对象的声明上。

// 全局函数
constinit int x = 10;int main() {// 局部静态函数constinit static int y = 20;
}

非初始化声明thread_local

下面是cpppref原话和code

constinit 也能用于非初始化声明,以告知编译器 thread_local 变量已被初始化,以减少隐藏的防卫变量所致的开销。

extern thread_local constinit int x;
int f() { return x; } // 无需检查防卫变量



END

http://www.lryc.cn/news/249807.html

相关文章:

  • python实现获取aws route53域名信息
  • Linux_Linux终端常用快捷键
  • Neo4j 数据库管理 数据备份与恢复(头歌)
  • TCP传输的三次握手四次挥手策略
  • 在gitlab上使用server_hooks
  • 【云原生系列】Kubernetes知识点
  • Hugging-Face报错锦囊(不断更新)
  • Redis核心数据结构
  • Redis 如何批量删除指定前缀的Key
  • 如何熟练使用vim工具?
  • ClassNotFoundException: org.apache.hive.spark.client.Job
  • 《合成孔径雷达成像算法与实现》_使用CS算法对RADARSAT-1数据进行成像
  • GCN01——Ubuntu中设置vivado编辑器为vscode
  • Android 11.0 软硬键盘同时使用的兼容(软键盘与内置物理键盘共存)
  • ARM安全架构——为复杂软件提供保护
  • 提升网页交互体验的秘密武器——防抖和节流
  • HX3002入耳检测光感驱动调试-感0x08 寄存器溢出,不变化错误问题解决方法
  • 目标检测开源数据
  • AI模特换装的前端实现
  • git-5
  • qt 5.15.2压缩和解压缩功能
  • thinkphp6出现 htmlentities() expects parameter 1 to be string, array given
  • 【android开发-03】android中Intent的用法介绍
  • Java中时间工具详解:java.time包的应用
  • mysql 日志分析
  • 网络运维与网络安全 学习笔记2023.11.30
  • Perplexity 推出全新大型在线语言模型
  • python中的函数定义
  • 信贷销售经理简历模板
  • js事件流与事件委托/事件代理