| Časová náročnost: 10 minut |
V C++ lze definovat funkce, které vlastně nejsou volány, přesněji řečeno jsou rozšiřovány dle místa každého volání. Je to stejný způsob jako makra s argumenty v jazyce C. Výhoda vkládaných in-line funkcí je, že s voláním funkce, ani s návratovým mechanismem není asociován žádný overhead. Neboli, že funkce in-line mohou být prováděny mnohem rychleji než normální funkce. Nevýhodou in-line funkcí je to, že jsou-li veliké a jsou-li volány často, program se podstatně zvětší. Proto jsou jako
in-line funkce deklarovány pouze krátké funkce. Když definujeme in-line funkci prostě před její identifikátor vložíme klíčové slovo
inline.
| Příklad 3.7. |
|
#include <iostream.h>
inline int even(int x)
{
return !(x%2);
}
int main()
{
if(even(10)) cout << "10 je sude\n";
if(even(11)) cout << "11 je sude\n";
return 0;
}
|
Dále platí:
|
- Každá in-line funkce musí být definována před jejím prvním voláním. Jestliže tomu tak není, překladač nemá způsob jak by poznal, že se má rozšířit na in-line
- Funkce in-line může být překladačem optimalizována mnohem důkladněji než makro.
- Specifikátor inline není příkaz, ale požadavek pro překladač. Když z nějakých důvodů není překladač schopen tento požadavek splnit je funkce přeložena jako normální a požadavek inline je ignorován.
Následující příklad nám umožní třikrát přetížit min() a přitom je tato funkce deklarována jako inline.
|
| Příklad 3.8. |
|
#include <iostream.h>
inline int min(int a, int b)
{
return a<b ? a : b;
}
inline long min(long a, long b)
{
return a<b ? a : b;
}
inline double min(double a, double b)
{
return a<b ? a : b;
}
int main()
{
cout << min(-10, 10) << "\n";
cout << min(-10.01, 100.002) << "\n";
cout << min(-10L, 12L) << "\n";
return 0;
}
|
|
Jestliže je definice členské funkce dostatečně krátká, může být tato definice zahrnuta přímo do deklarace třídy. Tímto způsobem se funkce automaticky stane in-line funkcí, je-li to možné. Je-li funkce definována uvnitř deklarace třídy není již klíčové slovo inline nutné.
|
| Příklad 3.9. |
|
#include <iostream.h>
class samp {
int i, j;
public:
samp(int a, int b);
int divisible() { return !(i%j); } // inline funkce
};
samp::samp(int a, int b)
{
i = a;
j = b;
}
int main()
{
samp ob1(10, 2), ob2(10, 3);
// pravda
if(ob1.divisible()) cout << "10 je beze zbytku delitelne 2\n";
// nepravda
if(ob2.divisible()) cout << "10 je beze zbytku delitelne 3\n";
return 0;
}
|