固定サイズでビルドイン型のシンプルな構造体があります。私はメモリのチャンクを割り当てることによってメモリプールを作成し、このメモリを私の構造体のサイズのブロックに分割します。次に、特定のメモリブロック上のコンストラクタをコールするためにnewという配置を使用して、一部のメンバをデフォルト値で初期化します。それからdelete []演算子を呼び出すことによってメモリチャンク全体を解放したいと思います。新しいプレースメントで初期化された各オブジェクトの明示的なデストラクタ呼び出しを安全にスキップできますか?私は、そのクラスの他のメンバフィールドのコンストラクタまたは内部のコンストラクタ内にリソースを配置しません。私はちょうどメモリチャンク全体をリリースしたい。配置先の新規およびデストラクタ
答えて
それは些細なある場合は、デストラクタの呼び出しをスキップすることができます。
タイプはstd::is_trivially_destructible<Type>::value
表現を使用して些細な破壊である場合は、伝えることができます。最適化をオンにしてコンパイルすると、ほとんどのオプティマイザがこれを把握します。そのため、ブロック内のすべてのオブジェクトに対して簡単なデストラクタを呼び出すループを記述すると、パフォーマンスが低下することはありません。
'std :: is_trivially_destructible <>'を使って問題がないかどうかを判断できるだけでなく、あなたは本当に 'static_assert()'でそれを使用して、誰かが構造体に6か月間に 'string 'を追加しないようにする必要があります。 – Frank
構造体またはそのメンバーにデストラクタは明示的に定義されていますが、空のボディがある場合はどうなりますか? – user7242858
@ user7242858明示的に提供されているデストラクタは、本体が空であっても、軽視されません。 – dasblinkenlight
- 1. 配置の新規および完璧な転送
- 2. 新規および配列サイズ
- 3. パッケージ構造(およびイメージの配置先)
- 4. C++新規および削除のオーバーロード
- 5. Firebird dynamic Var新規および古い
- 6. 先読みおよび非キャプチャ正規表現
- 7. のstd ::先物および例外
- 8. Scalaの先物およびマルチスレッド
- 9. コンピューティングの先行および後続
- 10. Androidアプリのライセンス交渉新規および古い疑問
- 11. Jqueryのdetach()およびappendTo()の後に配置する要素
- 12. 再配置のUITableViewのセクション、行、およびセクション
- 13. 新規作成と削除および挿入パターン
- 14. 新規および削除char *例外が発生する
- 15. コンパイラまたは標準C++ライブラリ - 新規および削除
- 16. VisualSVNおよびWeb配置プロジェクトの推奨ファイル設定
- 17. 位置および配向のゲームオブジェクト明確にするため
- 18. Bison(およびフレックス)のコーディング規則
- 19. 正規表現のオプションおよびグループ
- 20. 検索配列、および
- 21. CodeIgniter、HMVC、および共通ライブラリを配置する場所
- 22. IIS、EC2、Webファーム、Web配置、およびELB
- 23. 条件付き行を検索(および再配置)する
- 24. UI、ビジネスロジックレイヤー、データレイヤー、およびWebサービスを配置する場所
- 25. 、更新およびyii2
- 26. エンティティフレームワーク、WCFおよび更新
- 27. 、検索および正規表現
- 28. Javaおよび正規表現
- 29. 大規模なデータセットおよびSQL Server
- 30. WooCommerce - 新規注文メール - 配送先住所の追加
説明する代わりにコードを表示してください。 –
正確には何をしているのかはっきりしませんが、一般的には、オブジェクトが些細に破壊可能である場合に限り、デストラクタの実行をスキップできます。 –
@BaummitAugenこの場合は、オプティマイザがそれをやってくれますので、実際にはそれについて考えるべきではありません。 –