まず、メモリは他のすべてのリソースを組み合わせた場合よりもはるかに(数十、数百、または数千時間も)一般的であると仮定することから始めましょう。すべての単一の変数、オブジェクト、オブジェクトメンバには、それに割り当てられ、後で解放されるメモリが必要です。開くファイルごとに、数十から数百万のオブジェクトを作成して、ファイルから引き出したデータを保存します。すべてのTCPストリームは、ストリームに書き込まれるために作成された無制限の数の一時バイト文字列と一緒になります。同じページにいますか?すばらしいです。
RAIIが機能するためには(太陽の下ですべてのユースケースに既製のスマートポインターを使用している場合でも)、所有権を取得する必要があります。あなたは誰がいけない、と所有権がAからBに確かに転送する必要があるとき、あなたが共有所有権を使用することができ、これを所有しているか、またはそのオブジェクト必要があります誰が分析する必要があるすべてのものが、その後、あなたはスマートポインタ経由でGCをエミュレートすることと思います。その時点で、GCを言語に組み込むのがはるかに簡単かつ迅速になります。
ガベージコレクションは、最も一般的に使用されるリソースであるメモリに関するこの懸念から解放されます。もちろん、他のリソースについても同じ決定を行う必要がありますが、それらはあまり一般的ではなく(上記参照)、複雑な(共有など)所有権もあまり一般的ではありません。精神的負担が大幅に軽減されます。
ここで、すべての値をガベージコレクションするための欠点をいくつか挙げます。ただし、メモリセーフGC と値型の両方をRAIIと1つの言語に統合するのは非常に難しいので、他の方法でこれらのトレードオフを緩和する方が良いでしょうか?
確定性の喪失は、確定的なオブジェクトの有効期間のみに影響するため、実際にはそれほど悪くないことがわかります。次の段落で説明するように、ほとんどのリソース(メモリは別ですが、メモリは豊富で、かなり遅延してリサイクルできます)は、これらの言語のオブジェクトの有効期間にバインドされていません。他にもいくつかのユースケースがありますが、私の経験ではまれです。
2つ目のポイントである手動リソース管理は、スコープベースのクリーンアップを実行するステートメントで対処されていますが、このクリーンアップをオブジェクトの有効期間に結合しません(したがって、GCおよびメモリの安全性と相互作用しません)。これはusing
、C#、with
Python、およびtry
最近のJavaバージョンの-with-resourcesにあります。