|
|
||
|
|
||
|
Регистры процессора |
||
|
|
||
|
Связь по управлению |
||
|
Фактические параметры |
||
|
Возвращаемое значение |
||
|
|
||
|
Локальные данные |
||
|
|
||
|
Связь по доступу |
||
|
Связь по управлению |
||
|
Фактические параметры |
||
|
|
|
Передача аргументов
– передача по значению;
– передача по указателю;
– передача по ссылке;
– копирование-восстановление – значения аргументов при вызове передаются в вызываемую процедуру, а если аргументы имеют l-value, то при возврате новые значения записываются в локальные переменные вызывающей процедуры (в вызове function(a, a+b) первый аргумент имеет l-value, а второй – не имеет);
– передача по имени – транслятором
создаются невидимые программисту thunk-функции,
передаваемые из вызывающей процедуры и вычисляющие значения аргументов в
контексте вызывающей процедуры при каждом обращении к аргументу в вызываемой
процедуре (если вызов функции выглядит примерно так:
function1( (a+ function2(b)) * c, …)
а сама функция выглядит так:
function1(int arg1) {
…
… + arg1 * …
…
…* ( arg1 – … )
…
}
);
Локальные данные процедур
Доступ к объекту примитивного типа
![]() |
Команды процедуры |
|
… Запись активации |
Доступ к элементу второго динамического массива в поле локальных данных записи активации
![]() |
||||||||||
|
||||||||||
Доступ к элементу массива в куче
![]() |
Текстуальная область видимости без вложенных процедур
Локальные объекты в записи активации.
Нелокальные объекты – в области статических данных.
Адреса (смещения) и тех и других могут быть вычислены во время трансляции.
Блочные области видимости
|
Объявление |
Область видимости |
|
int a = 0; |
B0, B2 |
|
int b = 0; |
B0, B1 |
|
int b = 1; |
B1, B3 |
|
int a = 2; |
B2 |
|
int b = 3; |
B3 |
main()
{int
a=0;
int b=0;
{int b=1;
{int a=2;
printf(“a=%d b=%d\n”,a,b);
}
{int b=3;
printf(“a=%d b=%d\n”,a,b);
|
Блок |
a |
b |
|
B2 |
2 |
1 |
|
B3 |
0 |
3 |
|
B1 |
0 |
1 |
|
B0 |
0 |
0 |
}
printf(“a=%d b=%d\n”,a,b);
}
printf(“a=%d b=%d\n”,a,b);
}
Выделение памяти локальных объектов блоков раздельно в области локальных данных записи активации:
![]() |
|
|
|
a2 | b3 |
|
b1 |
|
b0 |
|
a0 |
|
… |
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.