C++
Funkcje wbudowane
Szukaj…
Wprowadzenie
Funkcja zdefiniowana za pomocą specyfikatora inline
jest funkcją wbudowaną. Funkcja wbudowana może być wielokrotnie definiowana bez naruszania reguły One Definition , a zatem może być zdefiniowana w nagłówku z zewnętrznym powiązaniem. Deklaracja funkcji wbudowanej podpowiada kompilatorowi, że funkcja powinna być wbudowana podczas generowania kodu, ale nie daje gwarancji.
Składnia
-
inline
funkcji -
inline
function_definition - klasa {function_definition};
Uwagi
Zwykle jeśli kod wygenerowany dla funkcji jest wystarczająco mały, to jest dobrym kandydatem do wstawienia. Dlaczego tak? Jeśli funkcja jest duża i jest wbudowana w pętlę, dla wszystkich wykonanych wywołań kod dużej funkcji zostanie zduplikowany, co prowadzi do wygenerowania wzdęcia o rozmiarze binarnym. Ale jak małe jest wystarczające?
Chociaż funkcje wbudowane wydają się być świetnym sposobem na uniknięcie narzutu wywoływania funkcji, należy zauważyć, że nie wszystkie funkcje oznaczone jako inline
są inline
. Innymi słowy, kiedy mówisz inline
, jest to tylko wskazówka dla kompilatora, a nie kolejność: kompilator nie jest zobowiązany do wstawiania funkcji, można ją zignorować - większość z nich to robi. Współczesne kompilatory lepiej dokonują takich optymalizacji, że to słowo kluczowe jest teraz śladem przeszłości, gdy kompilator poważnie potraktował tę sugestię funkcji programisty. Nawet funkcje nie oznaczone inline
są wstawiane przez kompilator, gdy widzi w tym korzyści.
Inline jako dyrektywa dotycząca powiązań
Bardziej praktyczne zastosowanie inline
we współczesnym C ++ wynika z użycia go jako dyrektywy powiązań. Podczas definiowania , a nie deklarowania, funkcji w nagłówku, która ma być zawarta w wielu źródłach, wówczas każda jednostka tłumacząca będzie miała własną kopię tej funkcji, co prowadzi do naruszenia ODR (reguły jednej definicji); reguła ta z grubsza mówi, że może istnieć tylko jedna definicja funkcji, zmiennej itp. Aby obejść to naruszenie, zaznaczenie inline
definicji funkcji powoduje, że połączenie funkcji jest wewnętrzne.
FAQ
Kiedy powinienem napisać słowo kluczowe „inline” dla funkcji / metody w C ++?
Tylko wtedy, gdy chcesz, aby funkcja była zdefiniowana w nagłówku. Dokładniej tylko wtedy, gdy definicja funkcji może pojawić się w wielu jednostkach kompilacji. Dobrym pomysłem jest zdefiniowanie małych (jak w jednej linijce) funkcji w pliku nagłówkowym, ponieważ daje to kompilatorowi więcej informacji do pracy przy optymalizacji kodu. Zwiększa także czas kompilacji.
Kiedy nie powinienem pisać słowa kluczowego „inline” dla funkcji / metody w C ++?
Nie dodawaj inline
jeśli uważasz, że kod będzie działał szybciej, jeśli kompilator go wstawi.
Kiedy kompilator nie będzie wiedział, kiedy wstawić funkcję / metodę?
Ogólnie rzecz biorąc, kompilator będzie w stanie to zrobić lepiej niż ty. Jednak kompilator nie ma opcji wstawiania kodu, jeśli nie ma definicji funkcji. W maksymalnie zoptymalizowanym kodzie zwykle są wprowadzane wszystkie prywatne metody, niezależnie od tego, czy o to poprosisz, czy nie.
Zobacz też
Deklaracja funkcji inline niebędącej członkiem
inline int add(int x, int y);
Definicja funkcji wbudowanej niebędącej składnikiem
inline int add(int x, int y)
{
return x + y;
}
Funkcje wstawiane członka
// header (.hpp)
struct A
{
void i_am_inlined()
{
}
};
struct B
{
void i_am_NOT_inlined();
};
// source (.cpp)
void B::i_am_NOT_inlined()
{
}
Co to jest wstawianie funkcji?
inline int add(int x, int y)
{
return x + y;
}
int main()
{
int a = 1, b = 2;
int c = add(a, b);
}
W powyższym kodzie, gdy add
jest wstawiany, wynikowy kod stałby się mniej więcej taki
int main()
{
int a = 1, b = 2;
int c = a + b;
}
Funkcja inline jest nigdzie ich nie widać, jego ciało zostaje inlined do ciała rozmówcy. Gdyby add
nie wstawiono, wywołałaby funkcję. Narzut związany z wywoływaniem funkcji - takim jak tworzenie nowej ramki stosu , kopiowanie argumentów, tworzenie lokalnych zmiennych, przeskakiwanie (utrata lokalizacji referencji i utrata pamięci podręcznej) itp. - musi zostać poniesiony.