Я сейчас работаю над этой проблемой - то есть аналитическим вычислением стекирования. Очевидно, что это будет очень рекурсивный фрагмент кода, потому что вызов функции может иметь индексированный массив как один или несколько его аргументов, и один или несколько индексов массива могут включать вызовы функций!
Однако несколько реализаций позволяют некоторое облегчение от сложности:
(1) При использовании компилятора языка высокого уровня, в stackpointer в конце выполнения каждого кода линии прямой-оператора/должны быть на том же месте, что и в начале. (По крайней мере, это было бы хорошим правилом для наблюдения, иначе у вас будут проблемы!)
(2) Стоповый указатель после возврата из каждой функции или вызова подпрограммы должен быть таким же, как и перед вызовом. Поэтому максимальный размер стека является максимальным, по всем операторам программы, максимальным количеством стеков, достигнутым в каждом выражении. (По крайней мере, это было бы хорошим правилом для наблюдения, иначе у вас будут проблемы!)
Конечно, заявление может содержать рекурсивные проблемы, о которых я упоминал выше, но по крайней мере проблема нахождения максимального требования к стекированию вся программа затем сводится к поиску максимального требования к стекированию каждого оператора, а затем выбора максимального из них.
Это не может быть выполнено до тех пор, пока все вызванные функции также не будут скомпилированы.Поэтому я генерирую файл для каждого компилируемого модуля, который записывает несколько стекирует для каждого оператора (в основном, пиковое значение перед каждым вызовом функции и значение, которое неразумно перед каждым вызовом функции (исключая какие-либо еще неизвестные дополнения к стекированию, вызванные вызов функции) и имена функций. Затем я ретроспективно обрабатываю эти файлы, используя рекурсивную подпрограмму, после того, как все функции были скомпилированы, чтобы определить максимальный уровень стека.
Успешная вещь заключается в том, что рекурсивные подпрограммы могут быть максимально возможными требование стекирования не зависит от потока программы, хотя в типичном потоке (который зависит от данных) этот максимально возможный стекирование никогда не может быть достигнут.
Пример: предположим, функция 1 вызывает функцию 2, и программный поток обоих зависит от значения данных X. Предположим, что существует диапазон X, который заставляет функцию 1 выполнять свой худший оператор, который включает в себя вызов функции 2, которая не выполняет его наихудший случай для того же диапазона X. Поскольку мы вычислили максимально возможный стекиз, используя одновременно наихудшие случаи как для функции 1, так и для функции 2, мы, возможно, переоценили стекизацию. По крайней мере, мы допустили ошибку.
Я хотел бы дать прерывание Подпрограммы свои собственные stackspace на стек ОС, если они нуждаются в каких-либо, поэтому они не добавляют требования стеки программы, кроме возврата из прерывания адреса
зависит от чипсета/OS/язык программирования, который вы используете. – Ady
Рад видеть этот вопрос, имеет некоторые ответы, в отличие от http://stackoverflow.com/questions/177516/how-to-determine-optimal-thread-stack-size – Constantin
Я видел этот вопрос, когда спрашивал, но думал, что встроенный наклон разделен их ... –