RAIIとガベージコレクタの比較
質問
私は最近、CppCon 2016 で Herb Sutter 氏による "Leak Free C++..." についての素晴らしい講演を見ました。彼は、スマート ポインターを使用して RAII (Resource acquisition is initialization) - Concepts を実装し、それらがメモリ リークの問題の大半を解決する方法について語っています。
今、私は疑問に思いました。RAII のルールを厳密に守れば、それは良いことのように思えますが、なぜ C++ でガベージコレクタを持つことと違いがあるのでしょうか。RAII では、プログラマがリソースを再び解放するタイミングを完全に制御できることは知っていますが、これはガベージコレクタを持つことよりも有益なのでしょうか。本当に効率が悪くなるのでしょうか?ガベージコレクタを持つことは、コード上の小さなメモリ断片を解放する代わりに、一度に大きなメモリチャンクを解放することができるので、より効率的であるとさえ聞いています。
どのように解決するのですか?
RAII のルールを厳密に守れば、それは良いことのように思えますが、なぜ C++ でガベージコレクタを持つことと違いがあるのでしょうか?
どちらもアロケーションを処理しますが、その方法はまったく異なります。Java のような GC を指しているのであれば、それは独自のオーバーヘッドを追加し、リソース解放プロセスから決定論の一部を削除し、循環参照を処理します。
しかし、特定のケースのためにGCを実装することができ、はるかに異なるパフォーマンス特性を持つことができます。私はかつて、高性能/高スループットのサーバーで、ソケット接続を閉じるために 1 つを実装しました (単にソケットクローズ API を呼び出すと時間がかかりすぎ、スループット パフォーマンスが損なわれました)。これは、メモリではなく、ネットワーク接続と、周期的な依存関係の処理を必要としました。
RAII では、プログラマはリソースが再び解放されるタイミングを完全に制御できることは知っていますが、それはいかなる場合でもガベージコレクタを持つことよりも有益なのでしょうか?
この決定論は、GCが単純に許さない機能です。時々、あなたは が欲しい ある時点以降に、クリーンアップ操作が実行されたことを知ることができるようにしたい場合があります (一時ファイルを削除する、ネットワーク接続を閉じるなど)。
このような場合、GCでは不十分であり、C#では(例えば)、このような理由で
IDisposable
インターフェイスがあります。
ガベージコレクタがあれば、コード中の小さなメモリ断片を解放する代わりに、一度に大きなメモリチャンクを解放できるので、より効率的だとも聞いています。
できる......実装に依存する。
関連
-
[解決済み] error: 'ostream' does not name a type.
-
[解決済み] クラスにデフォルトコンストラクタが存在しない。
-
[解決済み】C++の余分な資格エラー
-
[解決済み】C++ - 適切なデフォルトコンストラクタがない [重複]。
-
[解決済み】なぜ、サイズ8の初期化されていない値を使用するのでしょうか?
-
[解決済み】JavaScriptのガベージコレクションとは何ですか?
-
[解決済み】なぜC++にはガベージコレクタがないのですか?
-
[解決済み】C++のRAIIとスマートポインタ
-
[解決済み] Haskellはガベージコレクタを必要としますか?
-
[解決済み] Androidにおけるガベージコレクタ
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】LLVMで暗黙のうちに削除されたコピーコンストラクタの呼び出し
-
[解決済み】Cygwin Make bash コマンドが見つかりません。
-
[解決済み】'cout'は型名ではない
-
[解決済み】デバッグアサーションに失敗しました。C++のベクトル添え字が範囲外
-
[解決済み】エラー:free(): 次のサイズが無効です(fast)。
-
[解決済み】指定範囲内の乱数で配列を埋める(C++)
-
[解決済み】Enterキーを押して続行する
-
[解決済み] 配列のベクトルを扱う正しい方法
-
[解決済み】c++で.txtファイルから2次元の配列に読み込む
-
[解決済み】なぜC++にはガベージコレクタがないのですか?