値型はスタックに格納されていると言われています。しかし、値型を で宣言するとどうなるnew
でしょうか? 例えば
int a;
スタックに格納されますが、
int b=新しい int();
b はどこに保存されますか? ヒープかスタックか?それは私を混乱させます。参照のようなものですが、値型です。
値型はスタックに格納されていると言われています。しかし、値型を で宣言するとどうなるnew
でしょうか? 例えば
int a;
スタックに格納されますが、
int b=新しい int();
b はどこに保存されますか? ヒープかスタックか?それは私を混乱させます。参照のようなものですが、値型です。
値型はスタックに格納されていると言われています
これはよく言われますが、明らかに誤りです。100 個の int を持つ配列を作成する場合、それらの int はスタックまたはヒープに存在しますか?
ストレージの寿命がストレージのタイプと関係があるという考えは、まったく誤りです。正しいステートメントは、寿命が短いことが知られている値型の変数は、短期間のストレージから割り当てることができるということです。
それを明確にしてくださいint i;
。「スタックに i を割り当てる」ことを意味するのは単に false です。これは、「i にストレージを割り当てる」ことを意味します。そのストレージの有効期間が短いことがわかっている場合は、短期ストアに割り当てることができます。それ以外の場合は、長期ストアに割り当てられます。
しかし、値型を new で宣言するとどうなるでしょうか?
あなたは、「新規」によって新しいストレージがヒープから割り当てられると考えています。そうではありません。「新しい」とは、「ストレージを取得してからコンストラクターを呼び出す」という意味と考えてください。
クラス データの有効期間が短いことがわかっていないため、クラス型に対して取得されたストレージは常にヒープ上にあります。値の型に対して取得されたストレージは、スタック上にあると文書化され、その後、値は最終的な宛先 (スタックまたはヒープ上) にコピーされます。ただし、コンパイラが安全であると判断できる場合は、その割り当てとコピーをコピー省略できます。
ここに役立ついくつかの記事があります:
http://blogs.msdn.com/b/ericlippert/archive/2010/09/30/the-truth-about-value-types.aspx
https://ericlippert.com/2010/10/11/debunking-another-myth-about-value-types/
スタックまたはヒープ、それが実装の詳細です。実際にはint
、スタック上にのみ存在するという保証はありません。パフォーマンスの面で優れていると判断した場合、ランタイムはヒープに任意の値型を割り当てることを決定できます。
EricLippertのブログでそれを読むことができます