参照カウントGCとトレースGCは言語プロパティですか、実装プロパティですか?


9

「Swiftはクラシック(トレース)GCを実行せず、ARCを使用する」と聞くことがあります。

しかし、参照カウントを必要とするSwiftセマンティクスに何かがあるかどうかはわかりません。トレースGCを使用するために、独自のSwiftコンパイラーとランタイムを構築できるようです。

それでは、Swiftについて正確に「参照カウント」とは何ですか?Appleの実装または言語自体?言語自体にそのラベルを使用できるほどARCを強力にサポートする言語またはライブラリの一部はありますか?

回答:


9

Swift は、オブジェクトへの最後の参照が削除されると、オブジェクトが初期化解除され、コードがすぐに実行されることを保証deinitます。

GCを通じてこの種の保証を取得することは不可能です。少なくとも、パフォーマンスを犠牲にすることなしには不可能です。標準のGCメカニズムは、deinitコードが最終的に、たとえば次のGCサイクルで実行されることのみを保証します。正確なセマンティクスのためには、どこかに参照カウントが必要です。


3
ああ、deinitキーワードの存在とそれに関連するセマンティクスは、実際には、参照の数え方を実装の領域ではなく、言語の中で真っ直ぐに置くものです。
Ray Toal 2015

2
何かが割り当て解除されるたびに、GCedランタイムが到達不能オブジェクトをチェックすることを妨げるものはありません。それはひどく非効率的です。
ラファエル

@Raphaelその点でより正確になるように編集されました。
カイ

3

chiは、swiftに関する本文の特定の質問に回答しています。この回答は、タイトルのより一般的な質問に回答します。

参照カウントGCとトレースGCは言語プロパティですか、実装プロパティですか?

参照カウントGCとトレースGCは、プログラマにさまざまな保証を提供します。

参照カウントは、オブジェクトが破棄されるプログラムフローの場所に確定性を提供します。これは、オブジェクトがすぐに解放する必要のある希少なリソースを所有している場合に重要になる可能性があります。一方、「強い」参照のサイクルを処理することはできません。

個々の言語の仕様次第で、どのような特性が保証されるのか、したがって、どの選択肢が準拠した実装で利用可能になるかが決まります。


4
refcountとGCを組み合わせることも可能です。次に、言語は、オブジェクトが参照されなくなるとすぐにデストラクタが実行され(何らかの形でrefcountが暗示される)、その参照サイクルが最終的に破棄される(何らかの形のGCが暗示される)ことを文書化します。あるいは、デストラクタが実行されるタイミングを言語が保証しない場合(Pythonとそのリファレンス実装の場合はIIRC)、実装はこれを行うことができます。その場合、実装プロパティになります。
Gilles「SO-邪悪なことをやめよう」

1

Swiftと呼ばれる言語を使用して、名前を「Swift with ARC」に変更できます。次に、まったく同じ構文で「Swift with GC」という名前の新しい言語を作成できますが、オブジェクトの割り当てがいつ解除されるかについての保証は少なくなります。

Swift with ARCでは、参照カウントが0になると、オブジェクトが移動します。ガベージコレクションを使用すると、弱い参照がある限り、その弱い参照を強い参照に割り当ててオブジェクトを「回復」できます。(Swiftでは、参照カウントが0になると、弱参照はnilになります); それが大きな違いです。

そしてもちろん、ARCを備えたSwiftでは、最後の参照カウントを強制終了すると、オブジェクトの割り当てがすぐに解除されることが保証されます。たとえば、FileWriterクラスがあり、2つのインスタンスが同時に存在する同じファイルに書き込むことは許可されていません。SwiftとARCでは、oldWriter = nilと言うことができます。newWriter = FileWriter(...)そして、新しいFileWriterは古いファイルが削除された後にのみ作成されることがわかります(別の参照を保持していない限り)。Swift with GCでは、これは機能しません。

もう1つの違いは、「Swift with ARC」では、強い参照サイクルによってのみ参照れ、実際には到達できないオブジェクトは、割り当て解除れないことが保証されていることです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.