質問

  

可能な重複:
  ヒープおよびスタックメモリの管理、実装、割り当てはどのように行われますか
  
C ++のスタック、静的、およびヒープ

C / C ++では、変数、関数、メンバー関数、クラスのインスタンスをスタックまたはヒープに保存できます。

それぞれの実装方法どのように管理されますか(高レベル)? gccは、スタックとヒープに使用するメモリのチャンクを事前に割り当て、要求に応じて消費しますか?元のメモリはRAMから来ていますか?

スタックではなくヒープに関数を割り当てることができますか?

             --Clarification--

ヒープメモリとスタックメモリの実装と管理について本当に質問しています。 参照されている質問を読んだ後、それに対処するものが見つかりませんでした。 。リンクに感謝します

役に立ちましたか?

解決

あなたの質問に、オペレーティングシステムに関する本の少なくともいくつかの章を簡単に書くことができると思います。 Tanenbaum:Modern Operating Systemsを読むことをお勧めします。

ヒープとスタックの主な違い。1つはプロセス項目ごと、もう1つはスレッド項目ごとです。最初にプログラムが開始されると、最小限のヒープとスタックセグメントが取得されます。ヒープは成長し、スタックは静的です(スレッドごとに)。終了しない再帰関数(無限再帰)を記述すると、スタックオーバーフローが発生します;)関数呼び出しにはスタックセグメント上にスタックフレームがあり、関数が終了すると、スタックが巻き戻され、フレームは次の機能。スタックは連続した線形構造です。 Linuxでは、環境変数を使用してプロセスのスタックセグメントサイズを構成できます。 Windows(少なくともMS Visual C ++を使用)では、スタックセグメントのサイズでリンカーフラグを渡すことができます。コンパイル時にいくつかの大きな配列を割り当てると、スタックオーバーフローが発生する可能性があります。

char test[1000000];

ヒープは別の話です。プロセスが起動すると、ヒープサイズはデフォルト値であり、OSごとに、またはそのOSで使用されている構成によって異なります(たとえば、Windowsでは、覚えている限りではデフォルトで2MBです)。さらに、より多くのヒープが必要な場合、変数などのためにより多くのスペースを割り当てるために、それは成長します。プログラムがヒープメモリを解放しない場合、プログラム(またはヒープスペース)が不足します。ヒープの実装にはさまざまなデータ構造があり、それらの一部はバイナリツリーの派生物であり、一部はそうではありません。フィボナッチヒープ(木の森)。メモリアロケータの作成方法に関する記事などを読むことができます。これらのデータ構造は、割り当てられたチャンクの割り当てを解除する必要があるときにヒープノードを見つけるか、新しいヒープスペースが必要になったときに追加(空きチャンクを見つける)するために最適化する必要があります。

32ビットOS上の各プロセスには、4GBの仮想アドレススペースがあります。ご想像のとおり、4GBの仮想アドレス空間を持つすべてのプロセスが収まるほど多くのRAMはありません。 OSメモリはページで構成されており、不要になったり期限が切れるとHDにスワップされます。これは、ページングが機能する場所です。すべてがページにマップされます:スタックまたは成長するヒープを持つプロセス。動的に成長するヒープの構造により、複数のページに配置できます。ページがメモリ内にない場合、ページフォールトが発生し、OSはディスクからページをロードする必要があるため、ヒープアクセスが非常に高価になる可能性があります(そして、速度が大幅に低下する可能性があります)。実行中のスレッドのスタックフレームは、プロセッサキャッシュにあり、RAMよりもはるかに高速です。

異なる種類のヒープが可能です。小さなオブジェクトに対して非常に高速なヒープや、マルチスレッド環境で非常に効率的なヒープが存在する場合があります。 Alexandrescuは、「Modern C ++ Design」で説明しています。スモールオブジェクトアロケーターとスモールオブジェクトを管理するヒープの開発方法。この実装は、彼のLoki C ++ライブラリで利用できます。一部の組み込みシステムは、物理的に異なるメモリ領域を提供し、異なるヒープタイプを上に実装できます。コンパイラーに勝つには、独自のアロケーター(ヒープマネージャーなど)を作成するのは大変です。

よろしく、
Ovanes

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top