Область видимости

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