スタックとヒープとは何ですか? 質問する

スタックとヒープとは何ですか? 質問する
  • スタックとヒープとは何ですか?
  • それらはコンピュータのメモリ内の物理的などこに配置されているのでしょうか?
  • OS または言語ランタイムによってどの程度制御されますか?
  • 彼らの範囲は何ですか?
  • サイズは何によって決まるのでしょうか?
  • 何が人を速くするのでしょうか?

ベストアンサー1

スタックは、実行スレッドのスクラッチ スペースとして確保されているメモリです。関数が呼び出されると、ローカル変数と一部の記録データ用にスタックの一番上にブロックが予約されます。関数が返されると、ブロックは未使用になり、次に関数が呼び出されたときに使用できます。スタックは常に LIFO (後入れ先出し) の順序で予約されます。つまり、最後に予約されたブロックが常に次に解放されるブロックになります。これにより、スタックの追跡が非常に簡単になります。スタックからブロックを解放するには、1 つのポインタを調整するだけです。

ヒープは、動的割り当てのために確保されたメモリです。スタックとは異なり、ヒープからのブロックの割り当てと解放には強制的なパターンはありません。いつでもブロックを割り当て、いつでも解放できます。これにより、特定の時点でヒープのどの部分が割り当てられているか、または解放されているかを追跡することがはるかに複雑になります。さまざまな使用パターンに合わせてヒープのパフォーマンスを調整できるカスタム ヒープ アロケータが多数あります。

各スレッドはスタックを取得しますが、通常、アプリケーションには 1 つのヒープしかありません (ただし、異なるタイプの割り当てに複数のヒープがあることは珍しくありません)。

質問に直接お答えします:

OS または言語ランタイムによってどの程度制御されますか?

OS は、スレッドの作成時に各システム レベルのスレッドにスタックを割り当てます。通常、OS は言語ランタイムによって呼び出され、アプリケーションのヒープ割り当てを行います。

彼らの範囲は何ですか?

スタックはスレッドにアタッチされるため、スレッドが終了するとスタックは再利用されます。ヒープは通常、ランタイムによってアプリケーションの起動時に割り当てられ、アプリケーション (技術的にはプロセス) が終了すると再利用されます。

それぞれのサイズは何によって決まるのでしょうか?

スタックのサイズは、スレッドの作成時に設定されます。ヒープのサイズはアプリケーションの起動時に設定されますが、スペースが必要になると大きくなります (アロケータはオペレーティング システムにさらに多くのメモリを要求します)。

何が人を速くするのでしょうか?

スタックの方が高速なのは、アクセス パターンによってメモリの割り当てと解放が簡単になる (ポインタ/整数は単純に増分または減分される) のに対し、ヒープでは割り当てや解放にはるかに複雑な記録が伴うためです。また、スタック内の各バイトは頻繁に再利用される傾向があり、プロセッサのキャッシュにマップされる傾向があるため、非常に高速になります。ヒープのパフォーマンスに影響を及ぼすもう 1 つの要因は、ヒープがほとんどグローバル リソースであるため、通常はマルチスレッド セーフである必要があることです。つまり、各割り当てと解放は、通常はプログラム内の他のすべてのヒープ アクセスと同期される必要があります。

明確なデモンストレーション:
画像ソース:vikashazrati.wordpress.com

おすすめ記事