как проверить размер стековой памяти с помощью программы в c# - PullRequest
2 голосов
/ 09 января 2020

Я перепробовал много способов, но есть способы найти, когда происходит переполнение стека, но нет программы, которая определяет действительный предел стека

1 Ответ

0 голосов
/ 09 января 2020

Ты прав; действительно, нет хорошего способа определить это. Но: если вы используете достаточно стека, чтобы это имело значение, что-то, вероятно, уже очень неправильно .

Существует два распространенных сценария ios, связанных с переполнением стека:

  • рекурсия, которая обычно может быть заменена нерекурсивной l oop, иногда включающей Stack<T> или Queue<T> в качестве заполнителя (при условии, что это не непреднамеренная ошибочная бесконечная рекурсия для веская причина - очень распространенная ошибка)
  • негабаритных локальных пользователей, в частности чрезмерное использование stackalloc для нетривиальных полезных нагрузок (последняя из которых часто может быть заменена арендой ArrayPool<T>, возможно, после проверки на нетривиальный размер полезной нагрузки)

В последнем случае было обсуждение вокруг условного API для "дать мне некоторый промежуток времени, но пусть среда выполнения решит, стоит ли использовать stackallo c или аренду или изолированный массив, основанный на размере и объеме пространства, оставленного в стеке ", но: он не был реализован до настоящего времени.

Кроме того, обратите внимание что использование большого количества стекового пространства может быть дороже, чем вы думаете; хотя может быть выделен большой стек, это виртуальная память, и ей не обязательно требуется фактическая память, пока она не будет использована впервые; Итак: планирование использования большого количества стекового пространства может привести к фактическому распределению памяти в области стека, которое затем никогда не будет восстановлено.

Итак, подведем итог, еще раз: нет, нет действительно хороший способ сделать это, но если вы хотите , вы, вероятно, делаете что-то не так.

...