2016-09-09 1 views
1

まず、私は現在C#で作業しており、メモリ管理についても読んでいます。ここまでは、スタックメモリと管理されたヒープメモリの違いを説明するスタックオーバーフローについての素晴らしい解答を読みました。回答の大部分は、
int x = 5と宣言すると、スタックメモリ内でxの種類に十分なメモリを割り当てていると言います。

私はヒープメモリの説明を読むと、これがどのように機能するのか理解しますが、混乱します。

あなたがint x = 5を言っている場合intSystem.Int32の別名であることから、xは技術的にSystem.Int32構造体の新しいインスタンスを指すポインタのではないでしょうか?もしそうなら、インスタンスオブジェクトのために使用されるのでヒープメモリに格納されません。

thisチュートリアルでは、(class1 cls1 = new class1()の行): スタックメモリは、オブジェクトのポインタとヒープのみに使用されていますか?

...スタック上にポインタを作成し、実際のオブジェクトは「ヒープ」と呼ばれる別のタイプのメモリ位置に格納されます。

このロジックでは、すべてがヒープに格納されず、スタックに格納されているポインタだけではありませんか? System.StringSystem.Int64System.BooleanSystem.Decimalなど

の新しいインスタンスであることは、例えば、私は、しかしはっきりと私にはない、私はそれを理解と思ったので、私は、スタックはポインタのみのためであるかどうか、私が誤解しましどの部分誰かが説明いただければ幸いです。前もって感謝します。

+1

'System.Int32'はクラスではなく構造体です。したがって、*ローカルとして*、それはおそらくスタックに割り当てられます。 – vcsjones

+1

。NET CLRが変更され、「割り当てられたヒープ」と「割り当てられたスタック」の間の線が引き続き曖昧になりつつあります。 – vcsjones

+0

そのチュートリアルでは、「新しいキーワードに当たったときには「ヒープ」に割り当てられます」と言っています。構造を使用するときは、新しいキーワードを使用する必要があります。それは部分的に私があまりにも混乱している理由です。 – Nathangrad

答えて

3

次のルールを使用できます。構造体(プリミティブ型を含む)の場合は、宣言された場所に割り当てられます。それ以外の場合は、ヒープ内のオブジェクトへのポインタが割り当てられます。

可能性のある場所は次のとおりです。ローカル変数の場合

  1. それはスタックです。物理的な値は、スタックではなくCPUレジスタに格納できることに注意してください。
  2. クラスフィールドの場合、クラスのインスタンスのヒープに割り当てられたメモリの連続したチャンクの内側にあります。
  3. これは、メタデータの一部としてローダーヒープに割り当てられています(私が間違っている場合は訂正してください)。

警告:これは、何が起こっているのかを基本的に理解するための基本的で包括的ではない説明です。現実はより複雑です。ローカル変数を持ち上げてヒープに移動し、オプティマイザでそれらを完全に削除することができます。

+1

* unhoisted *ローカル変数の場合、スタックかもしれません。あなたが正確であることを望むなら、コメントにリンクされているEric Lippertの記事を見てください。 –

+0

はい、ホイストされた変数は表示(クロージャ)クラスのフィールドになります –

+2

そして、変数はホイストされていなくてもスタックは使用されません。厳密にレジスタを使用するか、完全に最適化することができます。 – Servy

-1

あなたはどこで、どのように保存されているかを理解するためにClasses and structs (MSDN)をチェックすることもできます。クラスや構造体:

int x = 1; // 32 bits holding an integer in the stack 
System.Object bo = x; // 32+some more bits are on the heap to hold the "boxed" (wrapped to be kept on the heap) integer value 
System.Object ho = new Object(); // some bits are created on the heap right from the start 

簡単な言葉では、オブジェクトの2種類があります。クラス(参照型)はヒープに格納され、それらにポインタを持ちますが、構造体はスタックに格納されることを意図しています(構造体はヒープに再配置できますが、 )それら)。

CLRが一般的にどのように機能するかを実際に必要としている場合は、「CLR via C#」(Richter)を読むことを検討してください。

+0

自由時間が多い場合はECMA仕様を読むことができます。 –

+0

さらに追加したい場合は、回答を編集する必要があります。あなた自身(質問/回答)に直接コメントする必要はありません。 –

+5

"値の種類はスタックに格納され、参照の種類はヒープに格納されています"より複雑です。 – EJoshuaS

関連する問題