Определение функции (реализация). 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Определение функции (реализация).



Определение функции включает те же поля, что и прототип функции + тело функции – код, выполняющийся при вызове функции (заключён в {}).

double summa (double a, double b)

{

double c;

c=a+b;

return c;

}

Вызов функции: для обеспечения эффективного и безопасного вызова функций требуется обеспечить:

1) связь по управлению;

a)  вызов и возврат;

b) сохранение и восстановление контекста вызывающей части;

     2) функция должна производить одни и те же действия с разными наборами данных.      

вызывающая часть

стек

функция

a=5; b=8;

 

1) Сохранение контекста

sum(a;b)

 

вызова.

1) Формирование

2) Создание текущего

параметров в стеке.

5

контекста.

2) Сохранение адреса

8

3)      Тело функции.

возврата и передача

 

4)   Формирование

управления (вызова).

 

return sum func

3) Восстановление

 

5) Восстановление контекста

стека.

 

вызова.

4) Получение          результата.

 

6)       Возврат.

 

Вызов inline функции.

 

 Ключевое слово inline указывает компилятору, что он должен пытаться, каждый раз встречая вызов функции, вместо последовательности действий подставлять тело функции.

 

 При этом:

1. исключаются накладные расходы на вызов функции;

2. сохраняется структурность текста программы.

“-“ – увеличивает объем памяти

 

Inline функция не применима:

1. для функции, которая вызывается посредством указателя;

2. для функции с переменным числом параметров;

3. для рекурсивных функций.

inline
int sum(int x, int y)
{
return x+y;
}

main()
{
c=sum(3,5);
}

_ _cdecl, _fastcall, _stdcall - соглашение о вызове функции

Соглашения включают понятия:

1. способ передачи параметров (порядок размещения параметров в стеке);

2. кто восстанавливает стек – вызывающая или вызываемая функция;

3. способ хранения имён функций в объектном модуле;

Пример: пусть существует функция вида:

void calltype f(char c, short s, int i);
main()
{
f(‘A’, 10,9999, 1.23)

Адрес возврата A 10 9999 1,23
                                                  //вызов

                                       возврат организован командой ret()

 


сdecl - параметры формируются справа налево.

_stdcall (в стиле Паскаль) – используется для уменьшения объёма исполняемого файла.

_f@20

             //количество байт, занимаемое параметром в стеке

 

     


Способы передачи параметров

 

по значению                                                            по адресу

 

по указателю   по ссылке(C++)

  Передача параметров по значению – простая передача в стеке, не оставляющая возможности для изменения самих переменных, вызывающих функцию.

  Передача параметров по адресу – способ предполагает, что функция получает не копии объектов, а их адреса. При этом программист получает возможность изменить значение объекта по этому адресу. Вызовы подразделяются на вызовы по ссылке и по адресу.

 Если при передаче адреса требуется запретить функции модифицировать значения по этому адресу, используется ключевое слово const.

main()
{
int a=2, b=1, r1, r2;
fp(a,b,&r1,&r2);
}


указатель:
void fp(int x, int y, int *sub,int sum)
{
sum=x+y;
sub=x-y;
}

main()
{
int a=2, b=1,r1,r2;
fr(a,b,r1,r2);
}


ссылка:
void fr (int x, int y, int sum, int sub)
{
sum=x+y;
sub=x-y;
}

int My (const char *p)
{
int n=0;
while (*p)
{
     p++;
     n++;
}
return n;
}

main()
{
char ar[10]=”QWERTY”
int count = My(ar)
count=My(“ABC”);

}

 void f(int*)
main()
{
int x=1;
int 8p=&x;
f(p);
f(&x);
}

int f1();
void f2(int, int)
main()
{
int x=1; y=5;
int z=f1();
int w=x+y;
f2(z,w);
// f2(f1(), x+y);

}



Поделиться:


Последнее изменение этой страницы: 2021-12-15; просмотров: 46; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.135.198.49 (0.021 с.)