Почему максимальный размер стека вызовов отличается от образца к образцу? - PullRequest
0 голосов
/ 06 января 2019

Если я попытаюсь

var count = 0

function recurse() {
  count++
  recurse()
}

try {
  recurse()
} catch(e) {
  console.log(e.message, count)
}

результат Maximum call stack size exceeded 15662, но если я попробую

var count = 0

function recurse() {
  count++
  ( new Function( recurse.toString().split('\n').splice(1, 2).join('\n') ) )()
}

try {
  recurse()
} catch(e) {
  console.log(e.message, count)
}

тогда результат Maximum call stack size exceeded 8862.

Почему цифры разные?

Ответы [ 3 ]

0 голосов
/ 06 января 2019

Из-за того, что стек принадлежит не только вашей программе.

Например, когда ваша программа запущена, может быть обработано асинхронное прерывание, или ваша задача может быть приостановлена ​​планировщиком, а ЦПУ переключен на другую задачу. Если да, текущий контекст (регистры, PSW) вашей задачи сохранен в стеке и возобновлен, когда вы вернете контроль.

Как результат: потребление стека может изменяться, и все значения ниже указателя стека (SP) не определены. И если вы сохраните что-то ниже SP, не факт, вы прочитаете то же самое.

0 голосов
/ 06 января 2019

Потому что в первом сценарии размер машинного кода каждого рекурсивного вызова функции меньше. частное (размер стека / размер вызова функции в стеке) больше.

enter image description here

0 голосов
/ 06 января 2019

А-ч, согласно http://2ality.com/2014/04/call-stack-size.html,

количество рекурсивных вызовов, которые вы можете сделать, зависит от двух величин: размера стека и размера кадра стека (с параметрами и локальными переменными).

...