Ha un effetto semantico. Per semplificare, una funzione contrassegnata con inline
può essere definita più volte in un programma — sebbene tutte le definizioni debbano essere equivalenti tra loro — pertanto è richiesta la presenza di inline
per la correttezza quando si include la definizione di funzione nelle intestazioni (che a sua volta rende la definizione visibile in modo che il compilatore possa inline senza LTO).
Oltre a ciò, per inlining-the-optimization, "never" è un'approssimazione perfettamente sicura. Probabilmente ha qualche effetto in alcuni compilatori, ma non vale la pena di perdere il sonno, soprattutto senza dati reali. Ad esempio, nel seguente codice, using Clang 3.0 or GCC 4.7, main
contiene lo stesso codice se work
è contrassegnato con inline
oppure no. L'unica differenza è se work
rimane come funzione autonoma per le altre unità di traduzione a cui collegarsi o viene rimosso.
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);
}
}
Le macro non sono una garanzia al 100%. Un compilatore è libero di calcolare il codice duplicato (da più espansioni di una macro) in più chiamate alla stessa copia del codice (essenzialmente una chiamata di funzione). –
In C++ è efficace quando devi preoccuparti di [ODR] (http://en.wikipedia.org/wiki/One_Definition_Rule) ... probabilmente simile in C. – Mehrdad
@R ..: non so di compilatori che lo fanno però, quindi per me sono effettivamente garanzie. – Mehrdad