2014-12-14 19 views
8

Bene, non è garantito dallo standard che le funzioni inline siano effettivamente in linea; si devono usare macro per avere la garanzia 100  %. Il compilatore decide sempre quale funzione è o non è in linea in base alle proprie regole indipendentemente dalla parola chiave inline.Quando la parola chiave "in linea" è efficace in C?

Allora quando la parola chiave inline avrà effettivamente qualche effetto su ciò che fa il compilatore quando utilizza compilatori moderni come la recente versione di GCC?

+5

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). –

+0

In C++ è efficace quando devi preoccuparti di [ODR] (http://en.wikipedia.org/wiki/One_Definition_Rule) ... probabilmente simile in C. – Mehrdad

+0

@R ..: non so di compilatori che lo fanno però, quindi per me sono effettivamente garanzie. – Mehrdad

risposta

4

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); 
    } 
} 
+0

十 1 per l'effetto semantico, ma dovresti elaborarlo un po '. 'inline' non ti esonera dalla" regola di una definizione ". Ci deve ancora essere esattamente una definizione esterna e, se non corrisponde alla definizione in linea, il risultato non è definito. –

+0

@R .. Sì, riporto molti dettagli, alcuni dei quali probabilmente non ne sono nemmeno a conoscenza. Aggiungerò alcune parole di donnola. – delnan

+3

La "regola di una definizione" è un termine C++ e la semantica C++ di 'inline' non corrisponde a quella di C. C ha sempre bisogno di una definizione esterna, anche se esiste una definizione in linea in ogni unità di traduzione e * fa * consente definizioni incorporate che hanno corpi diversi (e non è specificato quale di questi viene chiamato). – hvd

1

Se si desidera controllare l'inlining, attenersi a qualsiasi pragma o attributo fornito dal compilatore per controllare tale comportamento. Ad esempio __attribute__((always_inline)) su GCC e compilatori simili. Come hai detto, la parola chiave inline viene spesso ignorata a seconda delle impostazioni di ottimizzazione, ecc.

Problemi correlati