740______________________________Часть II. Программирование на C++

тесь к предыдущей задаче на том месте, где вы ее оставили. Программы работают довольно похожим образом. Программа — это перечень необходимых дел, иногда делающий "скачок в сторону" (для вызова функции). Компьютер должен иметь надежный способ вернуться в покинутое место, когда он будет готов вернуться к прерванной задаче.

При нормальном выполнении программе бывает необходимо произвести промежуточные действия. Перед выполнением промежуточного шага программе нужно запомнить, где она была и какие действия производила, чтобы вернуться к выполнявшейся работе. Это запоминание осуществляется при помощи стека. Когда программа готова вернуться к прерванной деятельности, она считывает необходимую информацию из стека.

Другое назначение стека — обеспечить удобное место для хранения переменных, определенных внутри функций — локальных переменных. Таким переменным память обычно нужна только на время работы функции. Используя стек для переменных с коротким сроком жизни, компьютер обеспечивает себе удобный и многократно используемый источник памяти.

Совет

Представьте себе стек как толстую стопку купюр. Когда вам нужны деньги на карманные расходы, вы берете их из этой пачки. Получив зарплату, вы восполняете пачку. Эти приливы и отливы похожи на то, как стек вашей программы управляет оперативной памятью (Random Access Memory, RAM).

Программа хранит в стеке координаты места, в котором она была прервана. Эти координаты позволяют программе со временем туда вернуться. После завершения функции локальные переменные, хранящиеся в стеке, становятся не нужны; они извлекаются из стека, открывая программе доступ к информации, необходимой для возврата в точку, где она была прервана.

Есть весьма веская причина хранить разнородную информацию — массу всевозможных вещей в двоичном представлении — в одной и той же "стопке". Просто компьютеру слишком тяжело держать для каждого отдельного предмета из этой груды свое собственное отдельное место.

Почему же тогда не передать все функции управления памятью стеку, полностью избавив программистов от такого рода забот? Одна из причин в том, что стек отнюдь не безграничен. Вторая — в том, что стек — место весьма беспокойное. Его погрузочно-разгрузочная механика проста и удобна только тогда, когда требуется доступ к элементам на самом верху стека; но часто возникает необходимость обращаться к переменным более свободным образом, и к тому же далеко не все переменные могут существовать в рамках отдельно взятых функций.

Почему же тогда все эти вещи не сделать глобальными? Избыток глобальных переменных серьезно усложняет программы. Кроме того, при компиляции они размещаются в сегменте данных, который, опять-таки, тоже не бездонный. Обычно самый большой блок доступной памяти — это куча.