gpt4 book ai didi

c++ - C++20 中的 `constinit` 是什么?

转载 作者:行者123 更新时间:2023-12-02 03:02:58 38 4
gpt4 key购买 nike

constinit 是一个新的 keywordspecifierP1143 中提出的 C++20 中.

标准中提供了以下示例:

const char * g() { return "dynamic initialization"; }
constexpr const char * f(bool p) { return p ? "constant initializer" : g(); }
constinit const char * c = f(true); // OK
constinit const char * d = f(false); // ill-formed

我想到了几个问题:

  • constinit 是什么意思?为什么要引入它?什么情况下应该使用它?

  • 它会使变量不可变吗?它是否意味着 constconstexpr

  • 变量可以同时是 constconstinit 吗? constexprconstinit 怎么样?

  • 说明符可以应用于哪些变量?为什么我们不能将其应用于非static、非thread_local变量?

  • 它有任何性能优势吗?

此问题旨在作为后续有关 constinit 的一般问题的引用。

最佳答案

  • What does constinit mean? Why was it introduced? In which cases should we use it?

使用 static storage duration 初始化变量可能会导致两种结果:

  1. 变量在编译时初始化 ( constant-initialization );

  2. 变量在控件第一次通过其声明时被初始化。

情况 (2) 是有问题的,因为它可能导致 static initialization order fiasco ,这是与全局对象相关的危险错误的来源。

constinit关键字只能应用于具有静态存储持续时间的变量。如果修饰变量未在编译时初始化,则程序格式错误(即无法编译)。

使用constinit确保变量在编译时初始化,并且静态初始化顺序失败不会发生。

<小时/>
  • Does it make a variable immutable? Does it imply const or constexpr?

不,不。

但是,constexpr确实意味着constinit .

<小时/>
  • Can a variable be both const and constinit? What about constexpr and constinit?

可以是 constconstinit 。不能同时是constexprconstinit 。从措辞来看:

At most one of the constexpr, consteval, and constinit keywords shall appear in a decl-specifier-seq.

constexpr不等于const constinit ,因为前者要求不断破坏,而后者则不然。

<小时/>
  • To which variables can the specifier be applied? Why cannot we apply it to non-static, non-thread_local variables?

它只能应用于具有静态或线程存储持续时间的变量。将其应用于其他变量是没有意义的,如 constinit都是关于静态初始化的。

<小时/>
  • Does it have any performance advantages?

没有。然而,在编译时初始化变量的一个附带好处是,在程序执行期间不需要指令来初始化。 constinit帮助开发人员确保情况确实如此,而无需猜测或检查生成的程序集。

<小时/>

1:参见https://en.cppreference.com/w/cpp/language/storage_duration#Static_local_variables

关于c++ - C++20 中的 `constinit` 是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57845131/

38 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com