|
Программирование >> Дополнительные возможности наследования
Однако вы должны понимать, как в компьютере организована память. Без четкого представления о том, где располагаются ваши переменные после их создания и как передаются значения между функциями, программирование останется для вас непостижимой тайной. РазОивннв намято Когда вы начинаете работу со своей профаммой, операционная система (например, DOS или Microsoft Windows) выделяет различные области памяти в ответ на фебования компилятора. Как профаммисту на С++, вам часто придется интересоваться пространством глобальных имен, свободной памятью, регистрами, памятью сегментов программы и стеками. Глобальные переменные хранятся в просфанстве глобальных имен. Подробнее о просфанстве глобальных имен и свободной памяти речь пойдет на следующих уроках, а пока сосредоточимся на регисфах, оперативной памяти и стеках. Регисфы представляют собой специальную область памяти, всфоенную прямо в центральное процессорное усфойство, или центральный процессор (Central Processing Unit - CPU). На их плечи возложена забота о выполнении внуфенних вспомогательных функций, описание большей части которых выходит за рамки этой книги. Но мы все-таки остановимся на рассмотрении набора регисфов, ответственных за указание на следующую строку профаммы в любой момент времени. Назовем эти регисфЫ (все вместе) указателями команд. Именно на указатель команды ложится ответственность следить за тем, какая строка профаммы должна выполняться следующей. Сама программа находится в памяти компьютера, которая специально отведена для того, чтобы хранить операторы программы в двоичном формате. Каждая строка исходного текста программы транслируется в ряд команд, а каждая из этих команд хранится в памяти по своему адресу. Указатель команды содержит адрес следующей команды, предназначенной для выполнения. Эта идея иллюстрируется на рис. 5.6. Сегмент программы 100 Int х=5; 101 Int у=7; 102 Cout х; 103 Func(x,y); 104 у=9; 105 return; Указатель команды Рис. 5.6. Указатель команды Стек - это специальная область памяти, выделенная для хранения данных вашей профаммы, требуемых каждой вызываемой функцией. Она называется стеком потому, что представляет собой очередь типа последним пришел - первым вышел и напоминает стопку тарелок в руках официанта (рис. 5.7). Принцип последним пришел - первым вышел означает, что элемент, добавленный в стек последним, будет вынут из него первым. Большинство же очередей функционирует подобно очереди в теаф: первый, кто занял очередь, первым из нее и выйдет (и войдет в теаф). Стек скорее напоминает стопку монет, удерживаемых специальным приспособлением. Если расположить в нем 10 монет достоинством в 1 копейку, а затем попытаться вынуть несколько монет, то первой вы достанете ту, что была вставлена последней. При помещении данных в стек он расширяется, а при возвращении данных из стека - сужается. Невозможно из стопки достать одну тарелку, не вынув предварительно все тарелки, помещенные в стопку перед ней. То же справедливо для данных в стеке памяти. Рис. 5.7. Стек Аналогия со стопкой тарелок приводится чаще всего. Такое сравнение довольно наглядно, но не вполне верно в смысле техники выполнения. Более точное представление позволит создать ряд прямоугольных полей, выровненных сверху вниз. Вершиной стека будет служить любое поле, на которое указывает в данный момент указатель вершины стека (эту роль выполняет другой регистр). Все поля имеют последовательные адреса, и один из этих адресов хранится в регистре указателя вершины стека. Все, что находится ниже вершины стека, относится к стеку. Все, что находится выше вершины стека, игнорируется, как показано на рис. 5.8. Стек theVariable MyAge YourAge указатель вершины стека ячейки вне стека ячейки стека Рис. 5.8. Указатель вершины стека При помещении некоторого значения в стек оно размещается в поле, расположенном над вершиной стека, после чего указатель вершины изменяется таким образом, чтобы указывать на новое значение. При удалении значения из стека в действитель- ности происходит лишь изменение адреса указателя вершины стека таким образом, чтобы он указывал на подлежащий удалению элемент стека. Принцип действия схематически показан на рис. 5.9. Стек theVariable MyAge YourAge Указатель вершины стека Ячейки вне стека Ячейки стека Рис. 5.9. Перемещение указателя вершины стека Стек U функции Ниже перечислены действия, происходящие с программой, выполняемой под управлением DOS, при переходе к телу функции. 1. Увеличивается адрес, содержащийся в указателе команды, чтобы указывать на инструкцию, следующую после вызова функции. Затем этот адрес помещается в стек и будет служить адресом возврата по заверщении выполнения функции. 2. В стеке резервируется место для возвращаемого функцией значения объявленного вами типа. Если в системе с двухбайтовыми целыми для возвращаемого значения объявлен тип int, то к стеку добавляются еще два байта, но в эти байты ничего пока не помещается. 3. В указатель команды загружается адрес вызванной функции, который хранится в отдельной области памяти, отведенной специально для этих целей. Поэтому следующей выполняемой командой будет первый оператор вызванной функции. 4. Текущая вершина стека помечается и содержится в специальном указателе, именуемом указателем стека. Все, что добавляется в стек с этого момента и до тех пор, пока функция не завершится, рассматривается как локальные данные этой функции. 5. В стек помещаются все аргументы, передаваемые функции. 6. Выполняется команда, адрес которой находится в данный момент в указателе команды, т.е. первая строка кода функции. 7. По мере определения в стеке размещаются локальные переменные и функции. Когда функция завершается, возвращаемое значение помещается в область стека, зарезервированную на этапе 2. Затем из стека удаляется все содержимое вплоть до указателя стека, благодаря чему стек очищается от локальных переменных и аргументов, переданных функции.
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |