ПРОГРАММИРОВАНИЕ/ ЯЗЫКИ ПРОГРАММИРОВАНИЯ Лекция 2 Время жизни и области видимости программных объектов (весенний семестр 2012 г.) Доцент Кафедры вычислительных систем, к.т.н. Поляков Артем Юрьевич © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ»
Характеристики программных объектов 2 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ» Программные объекты Переменные Функции Тип Время жизни Область видимости Расположение в памяти Расположение в программе
Организация памяти программы 3 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ» Команды процессора, формируемые компилятором Внешние и статические переменные существуют до завершения программы Внешние и статические переменные существуют до завершения программы Код и данные используются несколькими процессами одновременно Код и данные используются несколькими процессами одновременно Код и данные потоков 1.Выделяется в любой момент времени 2.Освобождается явно 3.Рост – снизу-вверх 1.Выделяется в любой момент времени 2.Освобождается явно 3.Рост – снизу-вверх 1. Хранение стековых кадров 2. Локальные переменные функций 3. Рост – сверху-вниз 1. Хранение стековых кадров 2. Локальные переменные функций 3. Рост – сверху-вниз Память ядра ОС
Структура данных стек 4 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ» Стек (англ. stack стопка) структура данных, в которой доступ к элементам организован по принципу LIFO. Принцип LIFO (англ. last in first out, «последним пришёл первым вышел»). Чаще всего принцип работы стека сравнивают со стопкой тарелок: чтобы взять вторую сверху, нужно снять верхнюю.
СТЕК Пример использования стека вызовов 5 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ» int sum(int i,int j) { int r = i + j; return r; } int mulby4(int i) { int r; r = sum(i, i); r = sum(r, r);... } 0xfe Адрес возврата r r Регистры ( addr1 ) i i 1 1 Уменьшение адресов addr1addr xfe r r Регистры ( addr2 ) i i 3 3 j j addr
Динамическая память 6 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ» Динамическое распределение памяти способ выделения оперативной памяти компьютера для объектов в программе в процессе ее исполнения: объекты размещаются в «куче» (англ. heap); при создании объекта указывается размер памяти; в случае успеха, выделенная область памяти «изымается» из кучи и недоступна при последующих операциях выделения памяти; память занятая ранее под какой-либо объект может быть освобождена; освобождаемая память возвращается в кучу и становится доступной при дальнейших операциях выделения памяти.
Динамическая память (язык СИ) 7 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ» В языке Си существует четыре функции для динамического распределения памяти: malloc (от англ. memory allocation, выделение памяти), calloc (от англ. clear allocation, чистое выделение памяти) realloc (от англ. reallocation, перераспределение памяти). free (англ. free, освободить) Функции malloc, calloc, realloc обеспечивают выделение памяти; Функция free освобождение памяти, возвращенной любой из функций ее выделения.
Динамическая память (язык СИ) 8 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ» Прототипы (объявления/описания) функций работы с динамической памятью: #include void *malloc (size_t size); void *calloc (size_t num, size_t size); void *realloc(void *block, size_t size); void *free(void *block); Возвращаемое значение – обобщенный указатель ( void* ). Его использование позволяет выделять память для произвольных объектов.
Пример использования динамической памяти 9 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ» int *func1(int size){ int *p = (int*)malloc(size); int i; for(i=0;i
Расположение объектов в программе 10 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ» Область видимости Переменные Функции Тело функции Тело функции Файл Локальный Внешний Локальный Глобальный
Многофайловые программы 11 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ» Для структурирования исходного кода программы ее текст может быть распределен по нескольким файлам. Минимальные неделимые единицы разбиения программы: функции и внешние переменные. Только один файл может содержать функцию main Программные объекты могут быть локальными в рамках файла. В этом случае они не доступны из функций, расположенных в других файлах. Локальными являются функции и внешние переменные, имеющие класс памяти static. Программные объекты могут быть глобальными, т.е. доступными из любой точки программы. Глобальными являются функции и внешние переменные с классом памяти extern.
Пример многофайловой программы 12 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ» int sumsub(int *i,int j) { int k = *i *i = k - j; return k + j; } int sumsub(int*,int); int main(){ int s, m=3; s = sum(&m, 5); printf("%d",m); } sumsub.cmain.c gcc –Wall –o sum sumsub.c main.c
Классы памяти переменных 13 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ» Время жизни и область видимости переменной в языке Си определяется классом памяти переменной. Существуют следующие классы: auto - локальные переменные, память для которых выделяется при входе в составной оператор, и освобождается при выходе из него (располагаются в стеке). register – аналогичен классу auto, но, если это возможно, переменная будет размещена в процессорном регистре. static – переменные (локальные или внешние), существующие в течение всего выполнения программы. extern – глобальные переменные, используются для связи между функциями, в том числе независимо скомпилированными, которые могут находиться в различных файлах.
Класс памяти auto и register 14 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ» РасположениеСтек вызовов / регистры процессора Время жизниВ рамках блока операторов Область видимостиВ рамках блока операторов int f(int i) { int r = i; auto int k = 0; register int m;... } Адрес возврата k k Регистры CPU i i... r r CPU m m
Класс памяти static (локальные переменные) 15 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ» РасположениеСегмент данных Время жизниВсе время исполнения программы Область видимостиВ рамках блока операторов int f(int i) { static int r; static int m = 0;... }...
Класс памяти static (внешние переменные) 16 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ» РасположениеСегмент данных Время жизниВсе время исполнения программы Область видимостиВ рамках файла, начиная с объявления static int r; int f(int i) {... r = i;... }...
Глобальные переменные (внешние без класса памяти) 17 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ» РасположениеСегмент данных Время жизниВсе время исполнения программы Область видимости1.В рамках текущего файла, начиная с места объявления 2.Область видимости может быть рас- пространена на другие файлы с использованием класса памяти extern. int glob = 18; void f(){... }
Класс памяти extern (внешние переменные) 18 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ» РасположениеСегмент данных Время жизниВсе время исполнения программы Область видимостиВ рамках файла, начиная с объявления int glob = 18; void f(){ printf("GV=%d",glob); glob++; return; }... void f(); extern int glob; int main(){ printf("1:%d",glob); f(); printf("2:%d",glob); } functions.cmain.c
Класс памяти extern (локальные переменные) 19 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ» РасположениеСегмент данных Время жизниВсе время исполнения программы Область видимостиВ рамках блока операторов int glob = 18; void f(){... }... int f2(){ extern int glob;... } func1.cfunc2.c
Разрешение конфликтов имен переменных 20 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ» При разрешении конфликтов имен компилятор руководствуется следующими правилами: 1. Переменные, имеющие одинаковую область видимости не могут иметь одинаковых имен. 2. В противном случае, если области видимости переменных пересекаются, переменная с меньшей областью видимости является более приоритетной. 3. Если области видимости не пересекаются, конфликта нет.
Разрешение конфликтов имен переменных (Пример) 21 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ» int i = 18; static int k = 8; void f(){ int i; if(...){ extern int i;... } extern int i = 1; static int k = 2; int f1(){ int k = 18; { int k = 19;... }... } file1.cfile2.c
Классы памяти функций 22 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ» В связи с тем, что время жизни функции всегда равно времени выполнения программы, количество классов для функций меньше, чем для переменных: extern класс памяти по умолчанию, указывать не обязательно; static класс памяти, предусматривающий ограничение области видимости функции в рамках одного файла.
Функции класс памяти extern 23 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ» int i = 18; static int k = 8; void f(){ int i; if(...){ extern int i;... } extern int i = 1; static int k = 2; int f1(){ int k = 18; { int k = 19;... }... } file1.cfile2.c
Литература 24 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ» 1.Подбельский В.В, Фомин С.С. Программирование на языке Си: Учеб. пособие. - 2-е доп. изд. - М.: Финансы и статистика, с. 2.Керниган Б., Ритчи Д., Фьюер А. Язык программирования Си. Задачи по языку Си: Пер. с англ. - М.: Финанасы и статистика, 1985.