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 inlineinline . 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.



Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow