3.4. In-line funkce

Časová náročnost
Č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.

src/3_7.cpp
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í:

upozornění
  1. 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
  2. Funkce in-line může být překladačem optimalizována mnohem důkladněji než makro.
  3. 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.

src/3_8.cpp
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;
}


upozornění 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é.

src/3_9.cpp
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;
}