2012-02-21 85 views
-3

可以說我們有一個值類型的局部變量(例如struct)。它會存在於堆棧中。但是struct的大小可以不同(8字節,800字節或8M字節)。堆棧的大小和值類型

當值類型的大小大於堆棧大小時會發生什麼?

+0

作爲參考,AFAIK C#不允許可變大小的結構體。如果結構給出了不同大小的外觀,它可能包含一個至少包含一些實際數據的引用類型。 – cHao 2012-02-21 07:01:00

+1

大小不變。不同的類型 - 不同的大小 – 2012-02-21 07:02:23

+0

啊..這使得更多的感覺:) – cHao 2012-02-21 07:03:23

回答

2

執行堆棧溢出時引發StackOverflowException。 Microsoft建議不要創建大於16字節的值類型。

+5

建議不是因爲存在堆棧溢出的風險,因爲默認情況下,結構會在每次分配或傳遞給函數時被複制 - 而複製更多的字節需要更多時間。不過,這是一個非常好的建議。 – cHao 2012-02-21 06:57:52

+0

是的,這就是爲什麼string是一個引用類型 – 2012-02-21 07:08:11

2

可以說我們有一個值類型的局部變量。存儲將分配到臨時池,這通常通過分配堆棧來實現。當存儲所有局部變量所需的存儲大小大於可用堆棧空間時會發生什麼?

你會得到一個「堆棧外」異常。我很好奇:當你用完堆棧時,你認爲會發生什麼其他行爲?

+0

好,可能有某種包裝來存儲堆或編譯器錯誤的數據。這是缺乏我的知識,我沒有找到答案前stackoverflow – 2012-02-21 07:00:00

+1

@YuriyVikulov:如果你知道你不會在堆棧上的空間,你當然可以將值存儲在堆 - 而是有多種的方式。你可以把它放到一個'object'中,或者使它成爲某種引用類型的成員,但更好的方法是創建一個值類型的數組,因爲數組永遠不會堆棧。但編譯器不會爲你做出這個決定。 – 2012-02-21 07:05:00

+0

我明白,擁有8Mb結構並理解你所提供的解決方案是一種醜陋的風格。這是我好奇心的原因問題原因。 – 2012-02-21 07:08:46