0

値型はスタックに格納されていると言われています。しかし、値型を で宣言するとどうなるnewでしょうか? 例えば

int a;

スタックに格納されますが、

int b=新しい int();

b はどこに保存されますか? ヒープかスタックか?それは私を混乱させます。参照のようなものですが、値型です。

4

2 に答える 2

13

値型はスタックに格納されていると言われています

これはよく言われますが、明らかに誤りです。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/

于 2013-01-24T23:02:41.900 に答える
9

スタックまたはヒープ、それが実装の詳細です。実際にはint、スタック上にのみ存在するという保証はありません。パフォーマンスの面で優れていると判断した場合、ランタイムはヒープに任意の値型を割り当てることを決定できます。

EricLippertのブログでそれを読むことができます

于 2013-01-24T22:29:05.817 に答える