2016-07-30 14 views
2

foo.cppを考える:ゼロ初期化されたstd :: atomic <T*>はnullptrで初期化されたものと等価ですか?

#include <atomic> 

namespace { 
    std::atomic<int*> gets_zero_init; 
    std::atomic<int*> gets_nullptr{nullptr}; 
} 

私はgets_zero_initがゼロに初期化され、その初期化がゼロ初期化後に完了したことをことを確信しています。私はまたgets_nullptrが最終的にnullptrで初期化されると確信しています。またstd::is_trivially_constructible<decltype(gets_nullptr), int*>::valuefalse(少なくとも私のコンパイラにあります)のため、gets_nullptrの初期化はゼロ初期化後に完全ではないと確信しています。しかし、私は、gets_nullptrがconstant init、static init、またはdynamic initの後に完全に初期化されているかどうかについて少しはっきりしていません。どちらですか?

また、0の初期化の後に目的のオブジェクトが完全に初期化され、それ以上の初期化は必要ないことを確認することに興味がありますので、私はgets_zero_initというアプローチを採用します。 gets_zero_initに埋め込まれたポインタはゼロ初期化のためにオールゼロビットパターンを保持します。

オールゼロビットパターンがnullptrと等価であることは保証されていますか?言い換えれば、私がgets_nullptrのセマンティクスを望むなら、それを提供するためにgets_zero_initのゼロ初期化に頼ることができますか?

+0

'std :: is_trivially_constructible :: value'を試しましたか? – Yakk

+0

@ヤクはい、私は実際にそれを最初に試みました。ダブルチェック、同じ問題。コンパイラはlibC++を使った 'Apple LLVM version 7.3.0(clang-703.0.31)'です。 – acm

答えて

0

私はそれを理解したと思います。

まず、投稿に誤りがあります。私は、zero-initとconstant-initが静的initの異なる形に過ぎないことを認識していませんでした。あなたはどちらか一方を得て、もう一方は得ない。だから、誤解のビットを無視してください。

gets_zero_initgets_nullptrはどちらも静的初期設定を取得します。最初は明らかにゼロ初期化を取得します。 Tをとる原子コンストラクタをconstexprの

  • ある

    • のstd :: gets_nullptrのコンストラクタへの引数は、換言すれば

    、両方gets_zero_init定数式である:第二のため、一定の初期化を取得しますgets_nullptrはスタティックな初期化を持っているので、オール0のビットパターンをnullptrと同等と仮定しないため、後者のほうが良い選択です。

  • 関連する問題