2009-05-05 6 views
45

Может ли кто-нибудь сказать мне, что такое емкость стека на C#.Емкость стека в C#

Я пытаюсь создать закрытый объект 3D-сетки, используя массив из 30 000 предметов.

+5

Вы можете просто проверить его самостоятельно, поставив триллионы элементов на ней и видеть, когда он выходит из строя? – Smashery

+0

Близкий вопрос: [Размер стека в Mono] (http://stackoverflow.com/questions/19817790/stack-size-under-mono). – Palec

ответ

67

Размер стека по умолчанию для приложения .NET составляет 1 МБ (по умолчанию 256 КБ для 32-разрядных приложений ASP.NET и 512 КБ для 64-разрядных приложений ASP.NET), но вы можете это изменить. Для приложения вы можете изменить размер по умолчанию, изменив заголовок PE исполняемого файла. Для создаваемых потоков вы можете использовать перегрузку конструктора, которая принимает размер стека.

Но, как указывает Антон Тайджи, в его ответах массивы являются ссылочными типами и, следовательно, расположены на куче (даже если массив содержит кучу типов значений).

+3

Размер 256 KB для приложений ASP.Net предназначен для 32-разрядных приложений. В 64-разрядной версии Windows Server 2008 и выше размер стека был увеличен до 512 КБ. См. KB 932909 для получения дополнительной информации. – Dono

+0

@Dono Спасибо за информацию. Я обновлю. –

+2

@BrianRasmussen Фактически вы можете выделить массив в стеке с помощью 'stackalloc'. Кроме того, только потому, что что-то является ссылочным типом, необязательно означает, что он будет выделен в стеке или куче, он зависит от реализации CLR и в реализации .NET, он варьируется в нескольких особых случаях (размер типа и объем). –

50

Ваш массив будет жить на куче, размер стека не имеет значения в вашем случае.

+4

Нет, если вы объявите его с помощью stackalloc ... – Nuzzolilo

4

Чтобы использовать стек для хранения массива, вы должны использовать небезопасный код с указателями и stackalloc для выделения необходимого пространства памяти в стеке.

3

Если вы хотите проверить значение для вашей текущей сборки .Net, вы можете сделать это, используя команду ILDASM, входящую в командную строку Visual Studio. После того, как вы запустили инструмент, откройте сборку, а затем перейдите в меню View -> Headers. Теперь прокрутите вниз до PE Optional Header (32 bit) раздел в только что открывшемся окне Headers. Вы увидите два поля:

  1. Размер резерва стека - это само собой разумеется. Это размер памяти стека по умолчанию, выделенный для любого потока, созданного в вашей программе/приложении.
  2. Размер стека фиксации - совершенное стек пространство - (Цитирование Hans Passant из here)

Упомянутый пространство резервируется в файл подкачки операционной системы так стек всегда может быть выгружена при необходимости ,

enter image description here

 Смежные вопросы

  • Нет связанных вопросов^_^