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);
}
}
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). –
W C++ jest to skuteczne, gdy trzeba się martwić o [ODR] (http://en.wikipedia.org/wiki/One_Definition_Rule) ... prawdopodobnie podobne w C. – Mehrdad
@R ..: Nie znam żadnej kompilatory, które to robią, więc dla mnie są one skutecznymi gwarancjami. – Mehrdad