私は、遊んでみたい個人的なプロジェクトに D を使用することを検討している C++ プログラマーです。ガベージ コレクターを完全に無効にする方法があるかどうか、またそうするとどのようなリスクがあるのか疑問に思っていました。
new と delete をオーバーライドして malloc と free を使用することで、自分のメモリを管理できることはわかっていますが、そうする場合は、ガベージ コレクターをまったく実行しないほうがよいでしょう。
私は、遊んでみたい個人的なプロジェクトに D を使用することを検討している C++ プログラマーです。ガベージ コレクターを完全に無効にする方法があるかどうか、またそうするとどのようなリスクがあるのか疑問に思っていました。
new と delete をオーバーライドして malloc と free を使用することで、自分のメモリを管理できることはわかっていますが、そうする場合は、ガベージ コレクターをまったく実行しないほうがよいでしょう。
malloc と free を使用する場合は、std.c.stdlibを使用します。GC がこれらに触れることはありません。std.gcには、disable() を含むメモリ管理に必要なものがすべて含まれています。
しかし、GC は悪いことではありません。ほとんどすべてではないにしても、ほとんどの D のライブラリには、メモリが明示的に削除されていないコードのどこかがあるため、常にメモリをオフにしてもヒーローにはなりませんが、重要なパフォーマンス要件がある場合は問題ありません。
GC を使用すると、呼び出し元が参照をどこにも格納しなくても、配列のスライスやパラメーターでの新しいオブジェクトの作成など、すべての生産性が大幅に向上します。優れたコードはそれよりもはるかに少なく、GC を使用するとコードははるかに小さくなります。
私はD言語について読んでいました.Dで新しいと思われる仕様でこれを見つけました:
40.ベターC
-betterC は dmd のコマンド ライン フラグであり、コンパイラによる特定のランタイム機能のサポートを制限します。特に、betterC でコンパイルされた D プログラムまたはライブラリは、Druntime とリンクされていません。コンパイル時機能の使用は、決して制限されません。 https://dlang.org/spec/betterc.html
このコマンドライン フラグを使用した結果の 1 つは、GC と言語機能の中継を無効にすることです。
40.1 結果
Druntime が利用できないため、多くの D 機能が動作しません。例えば:
- ガベージ コレクション
- スレッドローカル ストレージ
- TypeInfo と ModuleInfo
- クラス
- 組み込みスレッド (例: core.thread)
- 動的配列 (スライスを除く) と連想配列
- 例外
- 文字列で切り替える
- 最終スイッチ
- 同期およびcore.sync
- 静的モジュールのコンストラクターまたはデコンストラクター
- 構造体デコンストラクター
- unittest (テストは -betterC フラグを使用して通常どおり行うことができます)
GC を削除して、malloc/free の単純なラッパーに置き換えることができます。