constinit
P1143で提案された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
意味ですか?なぜ導入されたのですか?どの場合に使用する必要がありますか?
それは変数を不変にしますか?それは意味しますか、const
それともconstexpr
?
変数はとの両方const
にconstinit
なれますか?何についてconstexpr
とconstinit
?
指定子はどの変数に適用できますか?それをstatic
非thread_local
変数、非変数に適用できないのはなぜですか?
パフォーマンス上の利点はありますか?
この質問はconstinit
、一般的な今後の質問のリファレンスとして使用することを目的としています。
- どういう
constinit
意味ですか?なぜ導入されたのですか?どの場合に使用する必要がありますか?
静的ストレージ期間で変数を初期化すると、2つの結果が生じる可能性があります ¹:
変数はコンパイル時に初期化されます(定数初期化)。
変数は、コントロールがその宣言を初めて通過するときに初期化されます。
ケース(2)は、グローバルオブジェクトに関連する危険なバグの原因となる静的な初期化順序fiascoにつながる可能性があるため、問題があります。
constinit
キーワードは唯一の変数に適用することができ、静的記憶域期間。デコレートされた変数がコンパイル時に初期化されない場合、プログラムの形式が正しくありません(つまり、コンパイルされません)。
を使用constinit
すると、変数がコンパイル時に初期化され、静的な初期化順序の大失敗が発生しません。
- それは変数を不変にしますか?それは意味しますか、
const
それともconstexpr
?
いやいや。
ただし、constexpr
意味しconstinit
ます。
- 変数はとの両方
const
にconstinit
なれますか?何についてconstexpr
とconstinit
?
これは、両方にすることができますconst
とconstinit
。これは、両方することはできませんconstexpr
とconstinit
。言葉遣いから:
最もの一つで
constexpr
、consteval
、およびconstinit
キーワード供述指定子-seqの中に現れるものとします。
constexpr
const constinit
前者は一定の破壊を義務付けているので、後者はそうではないので、はと同等ではありません。
- 指定子はどの変数に適用できますか?それを
static
非thread_local
変数、非変数に適用できないのはなぜですか?
静的またはスレッドストレージ期間の変数にのみ適用できます。constinit
静的な初期化の場合のように、他の変数に適用しても意味がありません。
- パフォーマンス上の利点はありますか?
いいえ。ただし、コンパイル時に変数を初期化することの付随的な利点は、プログラムの実行中に初期化するための命令を必要としないことです。constinit
開発者は、生成されたアセンブリを推測したり確認したりする必要なく、それが事実であることを確認するのに役立ちます。
¹:https ://en.cppreference.com/w/cpp/language/storage_duration#Static_local_variablesを参照してください
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加