2017-08-09 7 views
3

固定サイズでビルドイン型のシンプルな構造体があります。私はメモリのチャンクを割り当てることによってメモリプールを作成し、このメモリを私の構造体のサイズのブロックに分割します。次に、特定のメモリブロック上のコンストラクタをコールするためにnewという配置を使用して、一部のメンバをデフォルト値で初期化します。それからdelete []演算子を呼び出すことによってメモリチャンク全体を解放したいと思います。新しいプレースメントで初期化された各オブジェクトの明示的なデストラクタ呼び出しを安全にスキップできますか?私は、そのクラスの他のメンバフィールドのコンストラクタまたは内部のコンストラクタ内にリソースを配置しません。私はちょうどメモリチャンク全体をリリースしたい。配置先の新規およびデストラクタ

+7

説明する代わりにコードを表示してください。 –

+1

正確には何をしているのかはっきりしませんが、一般的には、オブジェクトが些細に破壊可能である場合に限り、デストラクタの実行をスキップできます。 –

+1

@BaummitAugenこの場合は、オプティマイザがそれをやってくれますので、実際にはそれについて考えるべきではありません。 –

答えて

5

それは些細なある場合は、デストラクタの呼び出しをスキップすることができます。

A trivial destructor is a destructor that performs no action. Objects with trivial destructors don't require a delete-expression and may be disposed of by simply deallocating their storage.

タイプはstd::is_trivially_destructible<Type>::value表現を使用して些細な破壊である場合は、伝えることができます。最適化をオンにしてコンパイルすると、ほとんどのオプティマイザがこれを把握します。そのため、ブロック内のすべてのオブジェクトに対して簡単なデストラクタを呼び出すループを記述すると、パフォーマンスが低下することはありません。

+1

'std :: is_trivially_destructible <>'を使って問題がないかどうかを判断できるだけでなく、あなたは本当に 'static_assert()'でそれを使用して、誰かが構造体に6か月間に 'string 'を追加しないようにする必要があります。 – Frank

+0

構造体またはそのメンバーにデストラクタは明示的に定義されていますが、空のボディがある場合はどうなりますか? – user7242858

+1

@ user7242858明示的に提供されているデストラクタは、本体が空であっても、軽視されません。 – dasblinkenlight

関連する問題