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

由来

在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;

    // ok
    y = 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

相关推荐

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

    2023-12-06 16:02:03       60 阅读
  2. C语言——字符串常量初始化

    2023-12-06 16:02:03       54 阅读
  3. ubuntu 20.04.6 desk 安装 初始化

    2023-12-06 16:02:03       64 阅读
  4. C#对象初始化

    2023-12-06 16:02:03       59 阅读
  5. C++ 初始化列表

    2023-12-06 16:02:03       75 阅读
  6. c++ 指针的初始化

    2023-12-06 16:02:03       55 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2023-12-06 16:02:03       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2023-12-06 16:02:03       100 阅读
  3. 在Django里面运行非项目文件

    2023-12-06 16:02:03       82 阅读
  4. Python语言-面向对象

    2023-12-06 16:02:03       91 阅读

热门阅读

  1. P5706 【深基2.例8】再分肥宅水

    2023-12-06 16:02:03       63 阅读
  2. AIOps、微服务和云平台

    2023-12-06 16:02:03       56 阅读
  3. 做题笔记:SQL Sever 方式做牛客SQL的题目--VQ29

    2023-12-06 16:02:03       55 阅读
  4. 蓝桥杯官网练习题(平均)

    2023-12-06 16:02:03       60 阅读
  5. vscode配置代码片段

    2023-12-06 16:02:03       54 阅读
  6. rocketmq 集群环境部署及与spring cloud 集成

    2023-12-06 16:02:03       54 阅读
  7. RepidJson将内容写入文件简单代码示例

    2023-12-06 16:02:03       55 阅读
  8. 深度学习中的Transformer机制

    2023-12-06 16:02:03       58 阅读
  9. 封装请求头内容格式

    2023-12-06 16:02:03       52 阅读
  10. Flink-时间窗口

    2023-12-06 16:02:03       70 阅读
  11. AGI = 大模型 + 知识图谱 + 强化学习

    2023-12-06 16:02:03       66 阅读
  12. 数据库事务

    2023-12-06 16:02:03       59 阅读