网站建设的征求意见稿,互联网软件开发工资一般多少,网站域名变了能查吗,wordpress 自动提交表单文章目录 由来constinit 常量初始化常量初始化 ! 初始化常量初始化声明静态存储对象非初始化声明thread_local END 由来
在C多文件编译中会出现一个常见的问题#xff0c;叫做静态初始化顺序问题。Static Initialization Order Fiasco。
比如现在有两个文件#xff0c;其中… 文章目录 由来constinit 常量初始化常量初始化 ! 初始化常量初始化声明静态存储对象非初始化声明thread_local END 由来
在C多文件编译中会出现一个常见的问题叫做静态初始化顺序问题。Static Initialization Order Fiasco。
比如现在有两个文件其中都有一个全局变量。
// file1.cpp
int x 10;// file2.cpp
int y 20;由于多文件编译顺序等一些列问题可能又有第三个或者更多对象对这两个有了依赖就会出现一些列意想不到的问题。
通常解决方案是使用函数内部的局部静态变量Locia Static来解决该问题因为C保证了局部静态变量只有在第一次调用到的时候才初始化这也是著名设计模式单例模式中最常用的一个技巧。
而要正面应对这个问题就需要C20中的constinit。
constinit 常量初始化 constinit 说明符 (C20 起) - 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