問題タブ [zero-initialization]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - constexpr を使用した過度に熱心な C++ ユニオンのゼロ初期化
以下は、タグ付けされた共用体テンプレート「Storage」のダウンストリップされた例です。これは、共用体で囲まれた 2 つの型 L と R と、それらのどちらが格納されているかを示す bool を想定できます。インスタンス化では 2 つの異なるサイズの型が使用され、小さい方は実際には空です。
- コンストラクターはRメンバーをEmptyで初期化し、そのメンバーのユニオンのコンストラクターのみを呼び出しています
- ユニオン全体がデフォルトで初期化されることはありません
- すべてのコンストラクターは constexpr です
そのため、関数「createStorage2」は bool タグのみを設定し、union はそのままにしておく必要があります。したがって、デフォルトの最適化「-O」でコンパイル結果が期待されます。
代わりに GCC と ICC の両方が次のようなものを生成します
32 バイト構造全体をゼロにし、clang は予想されるコードを生成します。これはhttps://godbolt.org/z/VsDQUuで再現できます。「createStorage」静的関数からconstexprを削除すると、GCCはboolタグのみの目的の初期化に戻りますが、ICCは感銘を受けず、32バイトすべてを埋めます。
未使用のビットが「未定義」であると、ゼロに設定されて不要な CPU サイクルが消費されるなど、何でも許可されるため、これはおそらく標準的な違反ではありません。しかし、最初に効率上の理由から組合を導入し、組合員の規模が大きく異なる場合は面倒です。
ここで何が起こっているのですか?constexpr をコンストラクターから削除し、静的関数を使用できない場合、この動作を回避する方法はありますか?
補足: https://godbolt.org/z/FnjoPCのように、すべての constexpr が削除された場合でも、ICC はいくつかの追加操作を実行するようです。
これらのmovups命令の目的は何ですか?
c++ - C++ 構造体を `= {0}` に初期化すると、すべてのメンバーが 0 に設定されないのはなぜですか?
C ++で構造体をゼロに初期化する方法について大量のテストを行い、この回答を書いた後(注:それに対する反対票は、それを完全に書き直す前でした)、なぜ= {0}
すべてのメンバーを設定しないのか理解できません構造体をゼロに!
これを行う場合:
...出力は次のとおりです。
...出力は次のようになると予想していましたが:
...これは、FIRST メンバーのみがゼロに設定され、残りはすべてデフォルトに設定されたことを意味します。
私は常に、これら 3 つの方法のいずれかで構造体を初期化するとゼロ初期化されるという印象を受けていましたが、明らかに間違っています。
data_t d{}
data_t d = {}
data_t d = {0}
したがって、この回答からの私の重要なポイントは次のとおりです。
ここで重要なことは
data_t d{}
、 、data_t d = {}
、およびdata_t d = {0}
のどれも実際には構造体のすべてのメンバーをゼロに設定しないということです。
data_t d{}
すべての値を構造体で定義されたデフォルトに設定します。data_t d = {}
また、すべての値をデフォルトに設定します。data_t d = {0}
FIRST 値のみをゼロに設定し、他のすべての値をデフォルトに設定します。
= {0}
では、C++ 構造体を初期化してすべてのメンバーを 0に設定しないのはなぜでしょうか?
上記の重要なポイントは、実際には、私が何年も使用してきたこのかなり公式に見えるドキュメント ( https://en.cppreference.com/w/cpp/language/zero_initialization ) と矛盾していることT t = {} ;
に注意してください。T {} ;
実際、私のテストと上記の要点によると、初期化子はそうではありません。
参考文献:
- C++ で構造体を 0 に初期化する方法
- 更新: このリファレンスも指摘されました:オブジェクトを初期化するときの {0} の意味は何ですか?
c++ - C構造体はC++でゼロ初期化された空のブレースですか?
C ++ 17で私がする場合
変数mytm
(そして安全のためにもi
) はゼロで初期化されますか?
私はこれらのページを通してサークルに送られます:
そして、私が見つけることができる最も近いものは、ゼロ初期化からのものです:
...、初期化子が提供されていない集合体の要素の値の初期化を含む
別の方法 (私はなんとなく正しいと思います) は、デフォルトの初期化であり、これは初期化なしを意味します。しかし、これも値の初期化であり、ゼロを意味します。混乱している...
( C struct-initializationでは、イニシャライザを空にすることはできないことに注意してください。そのため、「C のように」という引数はここでは保持されません。)