2012-02-21 14 views
-3

値のタイプ(structなど)のローカル変数があるとします。それはスタックに存在するでしょう。しかし、構造体のサイズは違うかもしれません(8バイト、800バイト、または8 Mバイトのtheriotically)。スタックのサイズと値のタイプ

値の種類のサイズがスタックのサイズよりも大きい場合はどうなりますか?

+0

AFAIK C#では、可変サイズの構造体は使用できません。構造体が異なるサイズの外観を提供する場合、実際のデータの少なくとも一部を保持する参照型が含まれている可能性があります。 – cHao

+1

サイズは一定です。さまざまな種類 - 異なるサイズ –

+0

ああ..それはちょっと意味があります:) – cHao

答えて

2

実行スタックがオーバーフローすると、StackOverflowExceptionがスローされます。 16バイトを超える値の型を決して作成することはお勧めしません。

+5

デフォルトでは、構造体が割り当てられたり関数に渡されたりするたびに構造体がコピーされ、より多くのバイトをコピーするのに時間がかかりますので、スタックをあふれさせるリスクはあまりありません。それでも、それは非常に良い勧告です。 – cHao

+0

はい、これは文字列が参照型 –

2

値型のローカル変数があるとします。ストレージは一時的なプールに割り当てられます。一時的なプールは通常、スタックから割り当てて実装されます。すべてのローカル変数を格納するのに必要な記憶領域のサイズが使用可能なスタック領域よりも大きい場合はどうなりますか?

「スタック不足」の例外が発生します。私は好奇心が強いです:スタックを使い果たしたときに想像していた他の行動は何ですか?

+0

であることを示しています。ヒープやコンパイラのエラーにデータを格納するためのラッパーが存在する可能性があります。それは私の知識が不足していて、stackoverflowの前に答えが見つかりませんでした –

+1

@YuriyVikulov:スタックにスペースがないことが分かっているなら、確かにヒープに値を格納することができます。方法の。 'object'にボックスを入れることも、何らかの参照型のメンバにすることもできますが、より良い方法は、配列が決してスタックに入らないように、値型の配列を作ることです。しかし、コンパイラはあなたのためにこの決定をしません。 –

+0

私は8Mbの構造体を持つのは醜いスタイルであり、あなたが与えた解決策を理解していることを理解しています。それは私の好奇心の原因となった理性的な問題でした。 –

関連する問題