オペレータの削除は、ポインタがnullptrの場合に自分自身をチェックします。 nullptrを自分でチェックせずにdeleteを呼び出すと、パフォーマンス上のオーバーヘッドはありますか?速くptrがnullptrある場合は、上記の実行のどちらnullptr - パフォーマンスのオーバーヘッドを削除しますか?
delete ptr;
または
if (ptr != nullptr) delete ptr;
?
オペレータの削除は、ポインタがnullptrの場合に自分自身をチェックします。 nullptrを自分でチェックせずにdeleteを呼び出すと、パフォーマンス上のオーバーヘッドはありますか?速くptrがnullptrある場合は、上記の実行のどちらnullptr - パフォーマンスのオーバーヘッドを削除しますか?
delete ptr;
または
if (ptr != nullptr) delete ptr;
?
いつものように、それはコンパイラによって異なります。
私はMSVCを使用します。これは、これらの行をまったく同じコードにコンパイルします。
ポインタがnullの場合、削除は効果がないと言います。だからあなたがそれをチェックしなければ、コンパイラはとにかくしなければならない。
これは、過度の最適化の場合も間違いありません。最新のプロセッサでは、その差は数ナノ秒です。
チェックを行うことで、コードは呼び出しのオーバーヘッド(ライブラリルーチンの削除)を回避します。 99%のケースでは、余分な実行時間よりもソースコードのほんのわずかな複雑さ(中括弧、可能性のある誤植!=
など)が問題になります。
ポインタが 'null'の場合、コンパイラはデストラクタを呼び出すことも許可されていないので、チェックはライブラリ:: :: operator delete()の呼び出しの前に生成されたコード内になければなりません。 –
いいえ、ptr
がnullptr
であるかどうかを確認しないとオーバーヘッドはありません。
手動でチェックする場合は、同じチェックが2回行われますが、これはシステムコールのコストと比較するとわずかですが、ptr
がヌルでない場合に予想されます。
また、既にC++ 11を使用している場合は、deleteをまったく使用せず、代わりにスマートポインタを使用することを検討してください。 –
C++ 11は必要ありません - Boostには長年にわたって優れたスマートポインタがありました。 : - ] – ildjarn
もちろん!しかし、彼らがあなたの手の下に横たわっているとき、あなたはほとんどの標準的なケースでそれらを使用していないためのもう言い訳がありません:) –
ptrがnullptrの場合、上記のうちどれが速く実行されますか?
あなたのチェックが最適化されないと仮定すると、一番上の方が速くなります。それが最適化されれば、どちらも速くなることはありません。 コンパイラに任せてください。
後者は冗長であるため、潜在的な速度の違いは別として、悪化しています。 – ildjarn