web-dev-qa-db-ja.com

Swiftスタック/ヒープの理解

私はSwiftのスタック/ヒープに保存されているものを解読したいです。大まかな見積もりがあります。印刷するすべてのものとメモリアドレスは値ではなく、スタックに保存され、値として印刷されるものは、基本的に値と参照タイプに従って、ヒープ上にあります。私は完全に間違っていますか?また、オプションで、スタック/ヒープの視覚的な表現を提供できますか?

33
Dániel Nagy

7月に述べたように、参照型はヒープに格納され、値はスタックに格納されます…

ここで理由を説明したい…

スタックとヒープ?

スタックは静的メモリ割り当てに使用され、ヒープは動的メモリ割り当てに使用され、両方ともコンピュータのRAMに保存されます。

スタックに割り当てられた変数はメモリに直接保存され、このメモリへのアクセスは非常に高速であり、プログラムのコンパイル時に割り当てが決定されます。関数またはメソッドが別の関数を呼び出し、その関数が別の関数などを呼び出すと、最後の関数がその値を返すまで、それらすべての関数の実行は中断されたままになります。スタックは常にLIFOの順序で予約されます。最後に予約されたブロックは常に解放される次のブロックです。これにより、スタックを追跡するのが非常に簡単になります。スタックは、1つのポインターを調整する以上のものではありません。

enter image description here

ヒープに割り当てられた変数のメモリは実行時に割り当てられ、このメモリへのアクセスは少し遅くなりますが、ヒープサイズは仮想メモリのサイズによってのみ制限されます。ヒープの要素は互いに依存関係がなく、いつでもランダムにアクセスできます。ブロックはいつでも割り当てて、いつでも解放できます。これにより、特定の時間にヒープのどの部分が割り当てられているか、または解放されているかを追跡することがより複雑になります。

Escaping Closure:-留意すべき重要な注意点は、スタックに格納された値がクロージャでキャプチャされる場合、その値はクロージャーが実行されるまでにヒープが利用できるように、ヒープにコピーされます。

詳細については、 http://net-informations.com/faq/net/stack-heap.htm

51
Jaydeep Vyas

クラス(参照型)はヒープに割り当てられ、値型(Struct、String、Int、Boolなど)はスタックに存在します。より詳細な回答については、このトピックを参照してください。 なぜクラスよりも構造を選択するのですか?

16
Juul