Funkcje inline w C ++

Funkcje inline w C ++
Gdy normalna funkcja jest wywoływana w C ++, niektóre są podsłuchane tylko do wywołania funkcji. W rzeczywistości wywołanie funkcji wymaga czasu, zanim funkcja naprawdę zacznie się wykonywać. Tym razem między tym, że funkcja jest wywoływana, a gdy funkcja naprawdę zaczyna się wykonywać, nazywa się czas przełączania. Jeśli normalna funkcja jest duża, co oznacza, że ​​wykonanie zajmie dużo czasu, czas przełączania jest stosunkowo mały, a użytkownik może ją zignorować. Jeśli jednak normalna funkcja jest niewielka, podobnie jak wiele funkcji, czas przełączania, mniej więcej taki sam dla dużych i małych funkcji, nie należy ignorować. W wielu sytuacjach czas przełączania jest dłuższy niż czas, w którym niewielka funkcja naprawdę wykonuje; W niektórych przypadkach znacznie dłużej.

Aby rozwiązać ten problem, C ++ używa makro i funkcji inline. Makro jest jak mała funkcja, ale zwykle jest krótsza niż typowa mała funkcja. Najdłuższe makro jest nadal jednym „stwierdzeniem”. Ciało funkcyjne może mieć więcej niż jedno stwierdzenie. Mała funkcja wbudowana ma zalety w stosunku do normalnej małej funkcji.

Po zdefiniowaniu makro jest ono nazywane później w programie. Funkcja wbudowana jest również zdefiniowana, a następnie wywołana później w programie. Normalna funkcja jest zdefiniowana, a następnie wywołana później w programie. Wszystkie te trzy typy są zdefiniowane i wywołane później w programie. Każdy z nich można nazwać więcej niż raz.

Makro i małe funkcje wbudowane różnią się od funkcji normalnego podejścia, gdy są później w programie. Kompilator C ++ umieszcza zdefiniowany kod makro lub zdefiniowany mały kod funkcji wbudowanej (nadwozie), gdzie jest wywoływany w programie. Kiedy kompilator to zrobi, mówi się, że kompilator rozszerzył makro lub funkcję inline. Nie dotyczy to normalnej funkcji. Normalna funkcja nie jest rozszerzona, gdzie jest wywoływana.

Podczas gdy wywołanie normalnej funkcji wymaga czasu przełączania, aby funkcja była odpowiednio potwierdzona przed jej wykonaniem, makro lub małe funkcje wbudowane zaczyna wykonywać za każdym razem, gdy jest wywoływane, i nie ma marnotrawstwa czasu przełączania. To jest główna zaleta makro i mała funkcja wbudowana w stosunku do normalnej funkcji, i.mi., Czas przełączania jest pominięty.

W tym artykule wyjaśniono funkcje inline w C ++ w porównaniu z makrami. Podano wyjaśnienie makra. Porównanie funkcji wbudowanej i normalnej funkcji odbywa się pod koniec artykułu.

UWAGA: Mówi się, że wywołanie makra w programie wywołuje makro.

Treść artykułu

  • Wprowadzenie - patrz wyżej
  • Definiowanie makr i funkcji wbudowanych
  • funkcja wbudowana i kompilator
  • Porównanie makr i funkcji wbudowanych
  • Porównanie funkcji inline i normalnych
  • Wniosek

Definiowanie makr i funkcji wbudowanych

Makro obiektowe i zmienna inline
Istnieje obiektowe makro i jest makro podobne do funkcji. Odpowiednio istnieją zmienne wbudowane i funkcje wbudowane. Rozważ następujący program C ++:

#włączać
za pomocą przestrzeni nazw Std;
#definicja var1 „e”
inline char var2 = 'e';
int main ()

Cout << var1 << endl;
Cout << var2 << endl;
powrót 0;

Wyjście to:

mi
mi

Ten program ma obiektowe makro i zmienną wbudowaną. Każdy ma wartość „e”. Makro podobne do obiektu zaczyna się od #Define i nie ma wskaźnika typu. Zmienna inline zaczyna się od „wbudowanego”, a następuje wskaźnik typu. Makra mają wadę w porównaniu do typów wbudowanych, ponieważ nie wskazują na typ. Może to prowadzić do problemów z niedopasowaniem typu w programie. W funkcji main () var1 i var2 są odpowiednio kodem definicji różnych zmiennych.

Uwaga: Nie jest jasne, czy Var1 posiada sznurka lub dosłowny ciąg. Zwróć również uwagę, że makro, zarówno podobne do obiektu, jak i funkcjonalne, nie kończy się półkolonem. Kończy się naciśnięciem klawisza Enter. Zmienna wbudowana lub funkcja wbudowana kończy się na odpowiedni normalny sposób.

Funkcja makro i funkcja wbudowana
Makro podobne do funkcji to makro, które przyjmuje argumenty. Podobnie jak makro podobne do obiektu, gdziekolwiek przywoływane jest makro podobne do funkcji w programie, kompilator zastępuje wywołanie definicji kodu i eliminuje czas przełączania (narzut połączeń funkcyjnych) w czasie wykonywania.

Funkcja wbudowana jest funkcją, która zaczyna się od „wbudowanego”. Ma przewagę nad makro podobnym do funkcji z typem powrotu i typami argumentów. Makro podobne do funkcji nie ma typów argumentów ani typów zwrotnych. Jego typ zwrócenia to końcowa wartość nazwy makro.

Poniższy program C ++ ma makro podobną do funkcji i funkcję wbudowaną, z których każdy szuka maksymalnej wartości dwóch argumentów. Funkcja inline porównuje dwie liczby całkowite i zwraca większą liczbę całkowitą. Wartość zwracaną funkcji inline można przypisać do nowej zmiennej int. Z drugiej strony końcowa wartość makra staje się wartością makra.

#włączać
za pomocą przestrzeni nazw Std;
#definicja maxm (a, b) ((a)> (b) ? (a): (b))
Inline int maxi (int a, int b)
if (a> b)
zwrot a;
Jeśli < b)
powrót B;
if (a == b)
zwrot a;

int main ()

Cout << maxM(2.5, 6) << endl;
Cout << maxI(3, 7) << endl;
powrót 0;

Wyjście to:

6
7

Z makro argumenty powinny być typów kompatybilnych. Daje to makro przewagę nad funkcją wbudowaną, której typy argumentów powinny być takie same, w tym przypadku.

Nazwa makra to maksymalna. Argumenty to A i B. Reszta jest rodzajem ciała funkcyjnego, ograniczonego przez nawiasy. Mówi, że jeśli (a)> (b) jest prawdziwe, wówczas A staje się wartością makra; W przeciwnym razie B staje się wartością makra.

funkcja wbudowana i kompilator

Po tym, jak kompilator zastępuje wywołanie funkcji wbudowanej kodem definicji funkcji, program nadal musi uruchomić. Kompilacja nie działa ani nie realizuje programu. W przypadku funkcji normalnej narzut (czas przełączania) występuje po uruchomieniu programu (wykonywanym). Wymiana makro lub wbudowanego występuje podczas kompilacji, która odbywa się przed wykonaniem (przed wysłaniem programu do klienta lub użytkownika).

Ostatecznie czas przełączania jest pomijany lub uzyskiwany dla makr i małych funkcji wbudowanych. Jeśli jednak funkcja wbudowana jest duża, kompilator zdecyduje, czy funkcja zadeklarowana jako wbudowana, wbudowana, czy nie. Jeśli funkcja zadeklarowana jako wbudowana jest duża, może nie być znaczącym zyskiem w zastąpieniu żadnego z jego wywołania organem kodu funkcyjnego. Jeśli chodzi o kryteria decyzji kompilatora - patrz później.

UWAGA: Funkcja zdefiniowana w definicji klasy jest funkcją wbudowaną poprzedzoną specyfikatorem inline.

Porównanie makr i funkcji wbudowanych

Makro może działać z różnymi typami, o ile są kompatybilne. To zaleta. Prowadzi to jednak również do skutków ubocznych, co daje mu wadę. Funkcja inline przetestuje ważność typów argumentów przed użyciem argumentów, co zapobiega skutkom niepożądanym.

Porównanie funkcji inline i normalnych

Zalety funkcji wbudowanej

  • Nie ma narzutów funkcji (brak czasu przełączania).
  • Istnieje również narzut, gdy powraca normalna funkcja. W przypadku funkcji wbudowanej nie ma narzut zwrotu zwrotu.
  • Istnieje możliwa optymalizacja kontekstu ciała funkcyjnego z funkcją wbudowaną.

Wady funkcji wbudowanej

  • Dla każdego wywołania funkcji wbudowanej kod definicji funkcji (ciał) powtarzany jest (został zmuszony przez kompilatora). Może to prowadzić do bardzo dużego, binarnego (skompilowanego) pliku.
  • Kompilator zajmuje dużo czasu, ponieważ powtarza ten sam kod dla wszystkich połączeń.

Funkcje wbudowane mogą nie być potrzebne dla wielu wbudowanych systemów, ponieważ mniejszy rozmiar programu jest lepszy od większej prędkości.

Istnieją inne wady - patrz później.

Wniosek

Funkcja wbudowana jest jak makro. Służą temu samemu celowi. Kod definicji zastępuje każde wywołanie wywołania lub funkcji. Jednak funkcja wbudowana ma więcej zalet w stosunku do makra. Istnieje obiektowy makro i jest odpowiednio zmienna inline. Istnieje makro podobne do funkcji i odpowiednio jest funkcja wbudowana. Funkcja zdefiniowana w definicji klasy jest funkcją wbudowaną, niezależnie od tego, czy specyfikator inline jej poprzedza, czy nie.

Aby zdefiniować makro podobne do obiektu lub makro podobne do funkcji, poprzedzaj go #Define, a następnie nazwa makro. Makro nie określa typu wartości ani typów argumentów. Aby zdefiniować zmienną inline lub funkcję wbudowaną, poprzedź ją ze specyfikatorem, wbudowanym, a następnie typem powrotu, a następnie nazwy. W przypadku funkcji wbudowanej zarówno typ powrotu, jak i typy argumentów są precyzyjne. Efekty niepożądane można zapobiec.

Funkcja wbudowana ma ogólne zalety w zakresie makra. Istnieją zalety i wady, gdy funkcja wbudowana jest porównywana z funkcją normalną.