Вызов 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)
|
возврат организован командой 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);
}