私はconst
というメンバ変数を持っている状況がありますが、いくつかの制御パスではアクセスできないことがあります。このような場合、オブジェクトを構築するときに、そのメンバを初期化する時間を無駄にしたくありません。`const`メンバを空にする方法
は、以下の玩具例を考えてみてください。私はint const val;
にint val;
を変更した場合、しかし、
function(): # @function()
ret
:
struct Foo {
int val;
Foo() {}
};
auto function() { return Foo(); }
これは、所望のアセンブリ(クラン5.0.0 -O3
)を生成しますコンパイルが失敗します(const
メンバを初期化する必要があるため):
struct Foo {
int const val;
Foo() {} //<- Fails! `const` members must be initialized.
};
どのように私は、しかし、任意の実行時のコストをかけることなく、int const val;
を初期化することができますか?例:上記の例では、マークされた行をどのように修正する必要がありますか?
注:デフォルトの初期化val
このval
をゼロに初期化するので(すなわち、Foo() : val() {}
またはFoo() = default;
を使用して)、ない許容です:
function(): # @function()
xor eax, eax
ret
「xor eax、eax」が受け入れられない状況にありますか?もしそうなら、その状況はどういうものでしょうか? –
穏やかで貧弱な 'int'の場合、前述の' int'を初期化しないことから利得を測定するために、世界で最も正確な原子時計を使う必要があります。ゼロを初期化してから、より重要な問題に移ります。より高価なオブジェクトの場合は、 'std :: optional'が有望な解決策になります。 –
@NeilButterworth私が書いたように、これはおもちゃの例です。 IRL、 'val'は実際のオブジェクトかもしれません。その場合、オーバヘッドは任意に大きくなります。 – imallett