Вызов 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);

}

Использование “ , ” , формирование параметров.


void f(int);
int main()
{
int x;
std: cin>>x;
f(x);
// f (cin>>x, x);
}