C ++ 20の「constinit」とは何ですか?

どんぐり:

constinitP1143で提案れた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

  • 変数はとの両方constconstinitなれますか?何についてconstexprconstinit

  • 指定子はどの変数に適用できますか?それをstaticthread_local変数、非変数に適用できないのはなぜですか?

  • パフォーマンス上の利点はありますか?

この質問はconstinit、一般的な今後の質問のリファレンスとして使用することを目的としています

ヴィットリオ・ロメオ:
  • どういうconstinit意味ですか?なぜ導入されたのですか?どの場合に使用する必要がありますか?

静的ストレージ期間で変数を初期化すると、2つの結果が生じる可能性があります ¹:

  1. 変数はコンパイル時に初期化されます(定数初期化)。

  2. 変数は、コントロールがその宣言を初めて通過するときに初期化されます。

ケース(2)は、グローバルオブジェクトに関連する危険なバグの原因となる静的な初期化順序fiascoつながる可能性があるため、問題があります。

constinitキーワードは唯一の変数に適用することができ、静的記憶域期間デコレートされた変数がコンパイル時に初期化されない場合、プログラムの形式が正しくありません(つまり、コンパイルされません)。

を使用constinitすると、変数がコンパイル時に初期化され、静的な初期化順序の大失敗が発生しません。


  • それは変数を不変にしますか?それは意味しますか、constそれともconstexpr

いやいや。

ただし、constexpr意味しconstinitます。


  • 変数はとの両方constconstinitなれますか?何についてconstexprconstinit

これは、両方にすることができますconstconstinitこれは、両方することはできませんconstexprconstinit言葉遣いから:

最もの一つでconstexprconsteval、およびconstinitキーワード供述指定子-seqの中に現れるものとします。

constexprconst constinit前者は一定の破壊を義務付けているので、後者はそうではないので、はと同等ではありません。


  • 指定子はどの変数に適用できますか?それをstaticthread_local変数、非変数に適用できないのはなぜですか?

静的またはスレッドストレージ期間の変数にのみ適用できます。constinit静的な初期化の場合のように、他の変数に適用しても意味がありません


  • パフォーマンス上の利点はありますか?

いいえ。ただし、コンパイル時に変数を初期化することの付随的な利点は、プログラムの実行中に初期化するための命令を必要としないことです。constinit開発者は、生成されたアセンブリを推測したり確認したりする必要なく、それが事実であることを確認するのに役立ちます。


¹:https ://en.cppreference.com/w/cpp/language/storage_duration#Static_local_variablesを参照してください

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

east constexpr / constinit / constevalはC ++ 20で許可されていますか?

分類Dev

east constexpr / constinit / constevalはC ++ 20で許可されていますか?

分類Dev

C ++ 20のコルーチンとは何ですか?

分類Dev

c ++ 20のstd :: jthreadとは何ですか?

分類Dev

`printf`の%* c%* cとは何ですか?

分類Dev

Cの()で(void)とは何ですか

分類Dev

c ++ 20 [[no_unique_address]]の新機能は何ですか?

分類Dev

C ++ 20 std :: common_referenceの目的は何ですか?

分類Dev

cの整数定数とは何ですか?

分類Dev

Cのisatty()とは何ですか?

分類Dev

C ++の<=>演算子とは何ですか?

分類Dev

Cの>>> =演算子とは何ですか?

分類Dev

C ++の演算子「」とは何ですか?

分類Dev

C ++の演算子「」とは何ですか?

分類Dev

C ++の「->」演算子とは何ですか?

分類Dev

C ++の前方宣言とは何ですか?

分類Dev

C ++のchar ** argv []とは何ですか?

分類Dev

C ++の型消去とは何ですか?

分類Dev

C ++のconstexprとは何ですか?

分類Dev

C ++のchar()型とは何ですか?

分類Dev

C ++のint(*)[someValue]とは何ですか?

分類Dev

PythonのA、B = Cとは何ですか?

分類Dev

C ++の「<?=」演算子とは何ですか?

分類Dev

Cの部分式とは何ですか?

分類Dev

Cの「++ =」とは何ですか?

分類Dev

C ++の「&|」とは何ですか?

分類Dev

C ++ 20の文字列リテラル演算子テンプレートとは何ですか?

分類Dev

std :: make_arrayの目的は何ですか/何でしたか?C ++ 20でもまだ必要ですか?

分類Dev

&C :: cと&(C :: c)の違いは何ですか?

Related 関連記事

  1. 1

    east constexpr / constinit / constevalはC ++ 20で許可されていますか?

  2. 2

    east constexpr / constinit / constevalはC ++ 20で許可されていますか?

  3. 3

    C ++ 20のコルーチンとは何ですか?

  4. 4

    c ++ 20のstd :: jthreadとは何ですか?

  5. 5

    `printf`の%* c%* cとは何ですか?

  6. 6

    Cの()で(void)とは何ですか

  7. 7

    c ++ 20 [[no_unique_address]]の新機能は何ですか?

  8. 8

    C ++ 20 std :: common_referenceの目的は何ですか?

  9. 9

    cの整数定数とは何ですか?

  10. 10

    Cのisatty()とは何ですか?

  11. 11

    C ++の<=>演算子とは何ですか?

  12. 12

    Cの>>> =演算子とは何ですか?

  13. 13

    C ++の演算子「」とは何ですか?

  14. 14

    C ++の演算子「」とは何ですか?

  15. 15

    C ++の「->」演算子とは何ですか?

  16. 16

    C ++の前方宣言とは何ですか?

  17. 17

    C ++のchar ** argv []とは何ですか?

  18. 18

    C ++の型消去とは何ですか?

  19. 19

    C ++のconstexprとは何ですか?

  20. 20

    C ++のchar()型とは何ですか?

  21. 21

    C ++のint(*)[someValue]とは何ですか?

  22. 22

    PythonのA、B = Cとは何ですか?

  23. 23

    C ++の「<?=」演算子とは何ですか?

  24. 24

    Cの部分式とは何ですか?

  25. 25

    Cの「++ =」とは何ですか?

  26. 26

    C ++の「&|」とは何ですか?

  27. 27

    C ++ 20の文字列リテラル演算子テンプレートとは何ですか?

  28. 28

    std :: make_arrayの目的は何ですか/何でしたか?C ++ 20でもまだ必要ですか?

  29. 29

    &C :: cと&(C :: c)の違いは何ですか?

ホットタグ

アーカイブ