c++メモリ割り当て


C++メモリの割り当て方法の詳細:スタック、スタック、フリーストレージ、グローバル/静的ストレージ、定数ストレージ
c++メモリ割り当て
c/c++のstaticキーワードの詳細
c++ static
c++primer 220
 
 ---------------------------------------------------------------------------------
---------------------------------------------------------------------------------
C++では、メモリが5つの領域に分かれています
  • スタック領域(stack)は、コンパイラによって自動的に割り当てられて解放され、関数のパラメータ値、ローカル変数の値などが格納される.その動作は、データ構造内のスタックに似ています.
  • スタック領域(heap)はnewによって割り当てられたメモリブロックであり、一般的に1つのnewがdeleteに対応する.一般的にはプログラマによってリリースが割り当てられ、プログラマがリリースしない場合、プログラム終了時にOSによって回収される可能性があります.データ構造のスタックとは異なり、割り当て方法はチェーンに似ていることに注意してください.スタックは動的に拡張され収縮することができる.
  • 自由記憶領域はmallocなどによって割り当てられたメモリブロックであり、彼はスタックとよく似ているが、freeで自分の命を終わらせている.
  • グローバル領域(静的領域)(static)グローバル変数および静的変数の記憶は、隣接する別のブロック領域bssセグメントにおいて、初期化されたグローバル変数および静的変数が1つのブロックに配置され、初期化されていないグローバル変数および初期化されていない静的変数が格納される.プログラム終了後にシステムリリース
  • がある
  • 定数ストレージ領域には定数が格納されており、変更は許可されていません.定数文字列はここに置いてあります.定数文字列は修正できません.そうしないと、プログラムは実行期間中にクラッシュします(もちろん、不正な手段でも修正できますし、方法も多いです).プログラム終了後、システムにより
  • が解放する.
    プログラムコード領域には、関数体のバイナリコードが格納されます.
     
    申請後のシステムの応答
  • スタック:スタックの残りのスペースが申請されたスペースより大きい場合、システムはプログラムにメモリを提供します.そうしないと、例外プロンプトスタックがオーバーフローします.
  • スタック:オペレーティングシステムには空きメモリアドレスを記録するチェーンテーブルがあり、システムがプログラムの申請を受信すると、チェーンテーブルを遍歴し、申請空間よりも大きな最初の空間のスタックノードを探し、その後、そのノードを空きノードチェーンテーブルから削除し、そのノードの空間をプログラムに割り当てる.また、ほとんどのシステムでは、このメモリ領域のヘッダアドレスに今回の割り当てのサイズが記録されます.これにより、コードのdelete文が正しくメモリ領域を解放できます.また,見つかったスタックポイントの大きさが申請の大きさに等しいとは限らないため,余分な部分を自動的に空きチェーンテーブルに再配置する.

  • 応募サイズの制限
  • スタック:Windowsでは、スタックは低アドレスに拡張され、上から下に成長する拡張データ構造であり、連続したメモリの領域である.スタックトップのアドレスとスタックの最大容量はシステムで予め定められており、WINDOWSではスタックの大きさは2 M(1 Mということもあり、つまり1つのコンパイル時に決定される定数)であり、申請された空間がスタックの残りの空間を超えるとoverflowが提示される.したがって、スタックから得られる空間は小さい.
  • スタック:スタックは高アドレスに拡張されたデータ構造であり、不連続なメモリ領域である.これは,システムがチェーンテーブルで格納する空きメモリアドレスであるため,当然不連続であり,チェーンテーブルの遍歴方向は低アドレスから高アドレスである.スタックのサイズは、コンピュータシステムで有効な仮想メモリに制限されます.このことから,スタックが得られる空間は比較的柔軟であり,比較的大きいことが分かる.

  • 申請効率の比較
  • スタック:システムによって自動的に割り当てられ、速度が速い.しかし、プログラマーはコントロールできません.
  • スタック:newで割り当てるメモリは、一般的に速度が遅く、メモリの破片が発生しやすいが、最も便利である.

  • わりあてほうしき
  • スタックはいずれも動的に割り当てられ、静的に割り当てられていないスタックです.
  • スタックには、静的割当てと動的割当ての2つの割当て方式があります.静的割当ては、ローカル変数の割当てなど、コンパイラによって完了します.動的割り当てはalloca関数によって割り当てられますが、スタックの動的割り当てとスタックは異なり、彼の動的割り当てはコンパイラによって解放され、手動で実現する必要はありません.

  • ケース
    void f()
    { 
        int* p=new int[5];
    }

    この短い一言にはスタックとスタックが含まれています.newを見ると、まず、メモリのスタックを割り当てたと思います.ポインタpは?彼が割り当てたのはスタックメモリなので、スタックメモリにスタックメモリを指すポインタpが格納されているという意味です.プログラムでは、スタックに割り当てられたメモリのサイズを決定し、operator newを呼び出してメモリを割り当て、このメモリの最初のアドレスを返してスタックに入れます.