ВУЗ:
Составители:
Рубрика:
29
. . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . .
A:=B(I)+3.5
end;
function B;
var D:integer;
begin . . . . . . . . ….. . . . . . . . . . . . . . . . . . . .
B:=A(D)-1.8
end; ……………………………………
В языке Турбо Паскаль нет никаких ограничений на рекурсивные
вызовы подпрограмм, необходимо только хорошо понимать, что каждый
очередной рекурсивный вызов приводит к образованию новой копии
локальных объектов подпрограмм и все эти копии, соответствующие цепочке
активизированных и не завершённых рекурсивных вызовов, существуют
независимо друг от друга.
Более
подробно предварительное описание подпрограммы мы
рассмотрим позже.
Распределение памяти для локальных
переменных при рекурсии
Зачастую внесение рекурсивности в программы придаёт им
изящность. Но всегда он же “заставляет” программы расходовать больше
памяти. Дело в том, что каждый “отложенный” вызов функции и процедуры
– это свой набор значений всех локальных переменных этой функции,
размещённой в стеке. Если будет, например, 100 рекурсивных вызовов
функций, то в памяти должны разместится
100 наборов локальных
переменных этой функции.
Рассмотрим это поподробнее.
Все глобальные переменные (те которые описаны во внешнем блоке
программы) и все типизированные константы размещаются в одном сегменте
данных, который не может превышать объём 65536 байт или 64 кБ.
Локальные переменные размещаются в памяти динамически. После
завершения выполнения подпрограммы память, отведённая для её локальных
переменных, освобождается.
В некоторый момент выполнения программ в памяти может
присутствовать несколько групп локальных переменных, которые
соответствуют цепочке вызванных и не завершённых подпрограмм. В случае
очередного вызова новая область памяти связывается с последней группой в
30
цепочке. При завершении подпрограммы её локальные переменные
удаляются из хвоста цепочки. Этот принцип отведения и
освобождения
памяти соответствует понятию стека.
Стеком – является структура магазинного типа LIFO (Last In First
Out), т.е. локальные переменные помещаются в стек один за другим и
выбираются из стека в обратной последовательности.
Турбо Паскаль ограничивает объём стековой памяти одним
сегментом. Поэтому в случае слишком длинной цепочки вызова, что
случается в результате ошибок в рекурсивных
подпрограммах, сегмент стека
может переполниться, что повлечёт аварийное прекращение выполнения
программы.
В Турбо Паскале директива $М служит для задания максимального
размера стека. Минимально допустимый размер стека 1024 байт,
максимальный – 65536 байт, по умолчанию размер стека = 16384 байта.
Директива $M должна быть указана в начале программы. В этой директиве 3
целочисленных параметра:
1–ый задаёт максимальный размер
стека,
2–ой и 3–ий задают минимальный и максимальный размеры
динамической памяти (кучи - Heapsize), примеры:
{$M 10240, 0, 200000}
{$M 1024, 0,0}
{$M 16384, 1024, 65000}
Второй параметр носит ограничительный характер и устанавливает
тот объём памяти, при отсутствии которого программа вообще не может
работать. Если он равен 0, то программа будет запущенна в любом случае.
Третий параметр носит рекомендательный характер. Иными словами,
размер
динамической памяти будет определяться перед началом работы
программы, исходя из реального наличия свободной оперативной памяти, но
не будет превышать указанный в этом параметре объём.
По умолчанию устанавливается директива:
{$M 16384, 0,655360},
т.е. под стек выделяется 16 Кбайт, под динамическую память – вся свободная
оперативная память, доступная операционной системе.
Можно установить, кроме директивы, обсуждаемые размеры
с
помощью альтернативы Options/Memory Sizes в интегрированной среде или
. . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . цепочке. При завершении подпрограммы её локальные переменные
A:=B(I)+3.5 удаляются из хвоста цепочки. Этот принцип отведения и освобождения
end; памяти соответствует понятию стека.
function B;
var D:integer; Стеком является структура магазинного типа LIFO (Last In First
begin . . . . . . . . .. . . . . . . . . . . . . . . . . . . . Out), т.е. локальные переменные помещаются в стек один за другим и
B:=A(D)-1.8 выбираются из стека в обратной последовательности.
end; Турбо Паскаль ограничивает объём стековой памяти одним
В языке Турбо Паскаль нет никаких ограничений на рекурсивные сегментом. Поэтому в случае слишком длинной цепочки вызова, что
вызовы подпрограмм, необходимо только хорошо понимать, что каждый случается в результате ошибок в рекурсивных подпрограммах, сегмент стека
очередной рекурсивный вызов приводит к образованию новой копии может переполниться, что повлечёт аварийное прекращение выполнения
локальных объектов подпрограмм и все эти копии, соответствующие цепочке программы.
активизированных и не завершённых рекурсивных вызовов, существуют В Турбо Паскале директива $М служит для задания максимального
независимо друг от друга. размера стека. Минимально допустимый размер стека 1024 байт,
Более подробно предварительное описание подпрограммы мы максимальный 65536 байт, по умолчанию размер стека = 16384 байта.
рассмотрим позже. Директива $M должна быть указана в начале программы. В этой директиве 3
целочисленных параметра:
Распределение памяти для локальных 1ый задаёт максимальный размер стека,
переменных при рекурсии 2ой и 3ий задают минимальный и максимальный размеры
динамической памяти (кучи - Heapsize), примеры:
Зачастую внесение рекурсивности в программы придаёт им
изящность. Но всегда он же заставляет программы расходовать больше {$M 10240, 0, 200000}
памяти. Дело в том, что каждый отложенный вызов функции и процедуры {$M 1024, 0,0}
это свой набор значений всех локальных переменных этой функции, {$M 16384, 1024, 65000}
размещённой в стеке. Если будет, например, 100 рекурсивных вызовов Второй параметр носит ограничительный характер и устанавливает
функций, то в памяти должны разместится 100 наборов локальных тот объём памяти, при отсутствии которого программа вообще не может
переменных этой функции. работать. Если он равен 0, то программа будет запущенна в любом случае.
Рассмотрим это поподробнее. Третий параметр носит рекомендательный характер. Иными словами,
Все глобальные переменные (те которые описаны во внешнем блоке размер динамической памяти будет определяться перед началом работы
программы) и все типизированные константы размещаются в одном сегменте программы, исходя из реального наличия свободной оперативной памяти, но
данных, который не может превышать объём 65536 байт или 64 кБ. не будет превышать указанный в этом параметре объём.
Локальные переменные размещаются в памяти динамически. После По умолчанию устанавливается директива:
завершения выполнения подпрограммы память, отведённая для её локальных {$M 16384, 0,655360},
переменных, освобождается. т.е. под стек выделяется 16 Кбайт, под динамическую память вся свободная
В некоторый момент выполнения программ в памяти может оперативная память, доступная операционной системе.
присутствовать несколько групп локальных переменных, которые Можно установить, кроме директивы, обсуждаемые размеры с
соответствуют цепочке вызванных и не завершённых подпрограмм. В случае помощью альтернативы Options/Memory Sizes в интегрированной среде или
очередного вызова новая область памяти связывается с последней группой в
29 30
Страницы
- « первая
- ‹ предыдущая
- …
- 13
- 14
- 15
- 16
- 17
- …
- следующая ›
- последняя »
