72 Godzina 5
Kiedy wywołasz funkcję 10 razy, to program tyle samo razy „skoczy” do instrukcji danej funkcji. W pamięci istnieje tylko jedna kopia funkcji, a nie 10.
Jednak w ciągłym skakaniu z jednej funkcji do drugiej istnieje pewna niedogodność, związana z szybkością wykonywania programu. Niektóre funkcję są bardzo małe, jedna czy dwie linie kodu; możesz zwiększyć wydajność programu, jeśli unikniesz ciągłego skakania do tych kilku linii. Kiedy mówimy o wydajności programu, zazwyczaj mamy na myśli jego prędkość. Jest ona większa, gdy unikamy skoków do funkcji.
Jeśli funkcja jest zadeklarowana ze słowem kluczowym inline, to kompilator nie tworzy prawdziwej funkcji. Kopiuje natomiast jej kod w każde miejsce wywołania. Nie jest wykonywany żaden skok; wygląda to tak, jakbyś fizycznie wpisał treść funkcji zamiast ją wywoływać.
Pamiętaj jednak, że funkcje inline kosztują. Jeśli wywołasz taką funkcję dziesięciokrotnie to treść funkcji zostanie skopiowana w każde z dziesięciu miejsc wywołania. Niewielki wzrost wydajności może okazać się nieopłacalny w stosunku do wzrostu rozmiaru kodu wynikowego. Wzrost prędkości może być pozorny. Większość współczesnych kompilatorów posiada potężne wewnętrzne narzędzia i algorytmy do optymalizacji kodu, deklarowanie funkcji jako inline nie przynosi znaczących korzyści.
Kiedy zatem stosować funkcje inline? Kiedy masz małą funkcję (dwie, trzy linie), to możesz pomyśleć o zamienieniu ją na wewnętrzną. Jeśli masz jakiekolwiek wątpliwości to nie rób tego. Listing 5.6. demonstruje użycie funkcji wewnętrznych
1:
2:
3:
4:
5:
6:
7:
8:
9:
10
11
12
13
14
15
16
17
18
19
20 21 22
23
24
25
26
// Listing 5.6. - Użycie funkcji wewnętrznej
#include <iostream.h>
inline int RazyDwa(int);
int main()
{
int zrodlo;
cout « "Podaj liczbę: cin » zrodlo; cout « "\n";
zrodlo = RazyDwa(zrodlo);
cout « "Zrodlo: " « zrodlo « endl;
zrodlo = RazyDwa(zrodlo);
cout « "Zrodlo: " « zrodlo « endl;
zrodlo = RazyDwa(zrodlo);
cout « "Zrodlo: " « zrodlo « endl;
return 0;
)
Kiedy wywołasz funkcję 10 razy, to program tyle samo razy „skoczy” do instrukcji danej funkcji. W pamięci istnieje tylko jedna kopia funkcji, a nie 10.
Jednak w ciągłym skakaniu z jednej funkcji do drugiej istnieje pewna niedogodność, związana z szybkością wykonywania programu. Niektóre funkcję są bardzo małe, jedna czy dwie linie kodu; możesz zwiększyć wydajność programu, jeśli unikniesz ciągłego skakania do tych kilku linii. Kiedy mówimy o wydajności programu, zazwyczaj mamy na myśli jego prędkość. Jest ona większa, gdy unikamy skoków do funkcji.
Jeśli funkcja jest zadeklarowana ze słowem kluczowym inline, to kompilator nie tworzy prawdziwej funkcji. Kopiuje natomiast jej kod w każde miejsce wywołania. Nie jest wykonywany żaden skok; wygląda to tak, jakbyś fizycznie wpisał treść funkcji zamiast ją wywoływać.
Pamiętaj jednak, że funkcje inline kosztują. Jeśli wywołasz taką funkcję dziesięciokrotnie to treść funkcji zostanie skopiowana w każde z dziesięciu miejsc wywołania. Niewielki wzrost wydajności może okazać się nieopłacalny w stosunku do wzrostu rozmiaru kodu wynikowego. Wzrost prędkości może być pozorny. Większość współczesnych kompilatorów posiada potężne wewnętrzne narzędzia i algorytmy do optymalizacji kodu, deklarowanie funkcji jako inline nie przynosi znaczących korzyści.
Kiedy zatem stosować funkcje inline? Kiedy masz małą funkcję (dwie, trzy linie), to możesz pomyśleć o zamienieniu ją na wewnętrzną. Jeśli masz jakiekolwiek wątpliwości to nie rób tego. Listing 5.6. demonstruje użycie funkcji wewnętrznych
1: // Listing 5.6. - Użycie funkcji wewnętrznej
2:
3: #include <iostream.h>
4:
5: inline int RazyDwa(int);
6:
7: int main()
8: i
9: int zrodlo;
10:
11: cout « "Podaj liczbę: ";
12: cin » zrodlo;
13: cout « "\n";
14:
15: zrodlo = RazyDwa(zrodlo);
16: cout « "Zrodlo: " « zrodlo « endl;
17:
18: zrodlo = RazyDwa(zrodlo);
19: cout « "Zrodlo: ” « zrodlo « endl;
20:
21:
22: zrodlo = RazyDwa(zrodlo);
23: cout « "Zrodlo: " « zrodlo « endl;
24: return 0;
25: )
26: