#c# #.net #recursion #stack-overflow
#c# #.net #рекурсия #переполнение стека
Вопрос:
Мне сказали, что каждый метод имеет стек размером 1 мб. Итак, я предположил, что инициализация 256 целочисленных значений в одном методе вызовет исключение StackOverflowException. Я пробовал это в коде, но исключение не было выдано.
Итак, как преднамеренно вызвать исключение StackOverflowException без использования рекурсии?
Комментарии:
1. 256 * 4 байта = 1 КБ, а не 1 МБ
2. 256 целых чисел = 256 * 4 байта = 1024 байта = 1 КБ, а не 1 МБ. Для этого вам понадобится 256000 целых чисел. И я бы даже не пытался писать код с 256000 объявлениями. (редактировать: и Марк Гравеллс всегда быстрее) 🙂
3. Было бы довольно плохо, если бы вы могли использовать только
256 * 4
байты памяти в одном методе… С другой стороны, это, вероятно, помогло бы сохранить методы небольшими! 🙂
Ответ №1:
используйте
throw new StackOverflowException ();
Комментарии:
1. 1. Всегда используйте самый простой подход, который дает нужный вам результат? 🙂
Ответ №2:
stackalloc
вероятно, это самый простой способ (при условии, что вы хотите, чтобы среда выполнения выдавала ошибку, а не вы сами):
unsafe void Boom()
{
int* data = stackalloc int[512 * 1024]; // 2MB
}
Комментарии:
1. есть ли какая-либо разница при использовании в 64-битной системе? Стек больше?
Ответ №3:
Я добавлю еще один метод 🙂
unsafe struct FixedBufferExample
{
public fixed byte Buffer[128 * 1024]; // This is a fixed buffer.
}
Теперь эта структура составляет 128 КБ 🙂 Если вы объявляете локальную переменную (метода, который не использует yield или async) типа FixedBufferExample
, она должна использовать 128 КБ стека. Вы можете использовать свой стек довольно быстро.