C#のスタックとスタック

3003 ワード

2019年2月21日(Location:ordos)
       Lenovo   ,               ,          ,        。

一、スタックとスタックの呼び方
スタック:cの中でスタックと呼ばれ、c#の中では実は管理スタックと呼ばれています.
スタック:スタックです.スタックと一緒に呼ぶのが違和感があるので、スタックと略称します.
管理ヒープ:管理ヒープはヒープとは異なり、CLR(Common Language Runtime))によって管理され、ヒープがいっぱいになると自動的にヒープのゴミが片付けられます.だから、します.Net開発では、メモリの解放に関心を持つ必要はありません.
メモリスタックとデータ構造スタック:
1データ構造スタック:後進先出のデータ構造であり、概念であり、スタックは後進先出のデータ構造である.
②メモリスタック:メモリ内の2つのメモリ領域(スタック領域、スタック領域)が存在する.
スタック領域:関数のパラメータ、ローカル変数、戻りデータなどの値を格納し、コンパイラによって自動的に解放されます.
ヒープ領域:参照タイプのオブジェクトが格納され、CLRによって解放されます.
二、値タイプと参照タイプ
1、値タイプ、および参照タイプのメモリ割当て.
≪参照タイプ|Reference Type|oem_src≫:参照タイプがスタックに格納されます.タイプがインスタンス化されると、スタックに一部の空間ストレージクラスのインスタンスが開きます.クラスオブジェクトの参照はスタックに格納されます.
値タイプ:値タイプは常に宣言された場所に割り当てられ、ローカル変数としてスタックに格納されます.クラスオブジェクトのフィールドは、スタックに格納されます.
詳細:1、値タイプ変数宣言後、コンパイラは値が割り当てられているかどうかにかかわらず、メモリを割り当てます.2、参照タイプクラスを宣言すると、スタックに小さなメモリを割り当ててアドレスを格納するだけで、スタック上のメモリ領域は割り当てられません.newを使用してクラスのインスタンスを作成すると、スタック上の空間が割り当てられ、スタック上の空間のアドレスがスタック上の割り当てられたスライス空間に保存されます.3、値タイプの例は、通常、オンライン・スタックに割り当てられています(静的割当て).ただし、場合によってはスタックに格納できます.4、参照タイプのオブジェクトは、常にプロセス・スタックに割り当てられています(動的割当て).5、値タイプは変数タイプによってスタックに割り当てられます.6、参照タイプはスタック内の空間サイズが同じです.(スタックアドレス).7、配列の要素は参照タイプでも値タイプでも、管理スタックに格納されます.8、オブジェクトはc#でデフォルトでは過参照で渡されます.実はメソッドを呼び出すとき、パラメータ値(オブジェクトの1つの参照)は価値伝達で渡されます.参照で渡したい場合はrefまたはoutキーを使用できます
From me:参照タイプ宣言時にスタックに小さなメモリを割り当て、new(インスタンスの作成)時にスタックに空間を割り当て、スタック上の空間のアドレスはスタックに割り当てられた小さなメモリアドレスに保存されます.値タイプはスタックに割り当てられるとは限りません.値タイプが存在する場所によって決まります.
2、性能:
                ,         ,               ,            ,          ,               ,    。

すべての参照タイプのインスタンスは管理スタックに割り当てられ、c#のnewオペレータは現在のオブジェクトを指すメモリアドレスを返します.リファレンスタイプインスタンスを作成するときは、次の問題を考慮する必要があります.
1、メモリは管理スタックに割り当てられている
2、各オブジェクトを割り当てるときに、初期化する必要がある追加のメンバー(タイプオブジェクトポインタ、同期ブロックインデックス)が含まれます.
3、対象の他のバイトは常にゼロにする
4、対象を割り当てる時、一回のゴミ回収操作を行う可能性がある(管理スタックのメモリが一回の対象を割り当てるのに足りない場合)
パフォーマンス:
1、アプリケーションを設計する際、アプリケーションのタイプがすべてであれば、管理スタックの圧力を増大させ、ゴミ回収の回数を増加させるため、アプリケーションの性能は著しく低下する.
2、値タイプは軽量レベルのタイプですが、値タイプを大量に使用すると、アプリケーションのパフォーマンスが損なわれます(たとえば、以下で説明する梱包操作や解体操作、インスタンスの大きな値タイプを渡す操作、または大きな値タイプインスタンスを返す).
3、値タイプインスタンスの値は自分自身であり、参照タイプインスタンスの値は参照であるため、ある値タイプの変数を別の値タイプの変数に割り当てると、フィールド単位のコピーが実行され、参照タイプの変数を別の参照タイプの変数に割り当てる場合、メモリアドレスのみをコピーする必要があります.したがって、大きなオブジェクトに値を割り当てるときは、値タイプを使用しないでください.
3、参照タイプと値タイプの違い.
1、参照タイプと値タイプはSystermから継承する.Objectクラス.違いは、ほとんどの参照タイプがSystermから直接Objectは継承するが、値タイプは継承Systermである.ObjectのサブクラスSysterm.ValueTypeクラス.System.Value Type自体は値タイプではなくクラスタイプです.重要なのは、Value TypeがEquals()メソッドを書き換え、参照アドレスではなくインスタンスの値で値タイプを比較することです.
2、私たちは参照タイプの変数に値を付与する時、実はオブジェクトの参照を付与しただけです.値タイプ変数に値を割り当てるときにコピーを作成します(コピーがわかりませんか?一般的に言えば、変数をクローンしました(修正は元の変数に影響しません).
三、スタック空間の分配
1.スタックスペースの割り当て
①スタック(オペレーティングシステム):オペレーティングシステムによって自動的に割り当てられて解放され、関数のパラメータ値、局所変数の値などを格納する.その動作方式はデータ構造のスタックに類似する.
②ヒープ(オペレーティングシステム):一般的にプログラマーによって配布され、もしプログラマーが解放されなければ、プログラム終了時にOSによって回収される可能性があり、配布方式はチェーンテーブルに似ている.