2014-12-14 14 views
8

Cóż, nie ma gwarancji na podstawie standardu, że funkcje inline są rzeczywiście wstawione; należy użyć makr, aby uzyskać 100  % gwarancji. Kompilator zawsze decyduje, która funkcja jest lub nie jest wbudowana na podstawie własnych reguł, niezależnie od słowa kluczowego inline.Kiedy słowo kluczowe "inline" działa w C?

Kiedy słowo kluczowe inline rzeczywiście będzie miało jakiś wpływ na działanie kompilatora podczas korzystania z nowoczesnych kompilatorów, takich jak najnowsza wersja GCC?

+5

Makra nie stanowią 100% gwarancji. Kompilator może dowolnie korygować zduplikowany kod (z wielu rozszerzeń makra) na wiele wywołań do tej samej kopii kodu (zasadniczo wywołanie funkcji). –

+0

W C++ jest to skuteczne, gdy trzeba się martwić o [ODR] (http://en.wikipedia.org/wiki/One_Definition_Rule) ... prawdopodobnie podobne w C. – Mehrdad

+0

@R ..: Nie znam żadnej kompilatory, które to robią, więc dla mnie są one skutecznymi gwarancjami. – Mehrdad

Odpowiedz

4

Ma efekt semantyczny. Aby uprościć, funkcja oznaczona inline może być zdefiniowana wiele razy w jednym programie —, chociaż wszystkie definicje muszą być równoważne ze sobą —, więc obecność inline jest wymagana dla poprawności, gdy uwzględni się definicję funkcji w nagłówkach (co z kolei powoduje, że definicja widoczna, aby kompilator mógł ją wstawiać bez LTO).

Poza tym, w przypadku inline-optymalizacji, "never" jest całkowicie bezpiecznym przybliżeniem. Prawdopodobnie ma pewne działanie w niektórych kompilatorach, ale nie warto tracić czasu na sen, zwłaszcza nie bez rzeczywistych twardych danych. Na przykład w poniższym kodzie using Clang 3.0 or GCC 4.7, zawiera ten sam kod, czy work jest oznaczony jako inline, czy też nie. Jedyną różnicą jest to, czy work pozostaje jako samodzielna funkcja dla innych jednostek tłumaczeniowych do połączenia z, lub jest usuwana.

void work(double *a, double *b) { 
    if (*b > *a) *a = *b; 
} 

void maxArray(double* x, double* y) { 
    for (int i = 0; i < 65536; i++) { 
     //if (y[i] > x[i]) x[i] = y[i]; 
     work(x+i, y+i); 
    } 
} 
+0

十 1 dla jednego semantycznego efektu, ale powinieneś trochę go rozwinąć. 'inline' nie zwalnia cię z" reguły jednej definicji ". Wciąż musi być dokładnie jedna zewnętrzna definicja, a jeśli nie pasuje do definicji śródliniowej, wynik jest niezdefiniowany. –

+0

@R .. Tak, błyszczę wiele szczegółów, z których niektóre prawdopodobnie nie jestem nawet świadomy. Dodam kilka słów łasicy. – delnan

+3

"Jedna reguła definicji" jest terminem C++, a semantyka C++ słowa "inline" nie pasuje do tej z C. C zawsze potrzebuje jednej definicji zewnętrznej, nawet jeśli w każdej jednostce tłumaczeniowej istnieje definicja śródliniowa, a * nie * pozwala definicje śródliniowe, które mają różne ciała (i nie jest określone, które z nich zostanie wywołane). – hvd

1

Jeśli chcesz kontrolować inline, trzymaj się wszelkich pragm lub atrybutów, które zapewnia kompilator, aby kontrolować to zachowanie. Na przykład __attribute__((always_inline)) na GCC i podobnych kompilatorach. Jak już wspomniano, słowo kluczowe inline jest często ignorowane w zależności od ustawień optymalizacji, itp.

Powiązane problemy