2012-11-05 7 views
8

Questa parte del manuale di gcc è piuttosto oscura e non riesco a capire l'utilizzo dell'attributo forceinline dopo ripetuti tentativi.forzare la funzione inline in un'altra unità di traduzione

Sto definendo un oggetto e determinate funzioni per manipolare quell'oggetto. Poche di queste funzioni possono utilizzare istruzioni atomiche e voglio che il compilatore integri tali funzioni. Comunque non voglio scrivere quelle funzioni nel file header e dichiararle con "static inline" come nel kernel di Linux.

C'è un modo per forzare gcc alle funzioni inline da un'altra unità di traduzione?

risposta

9

è possibile utilizzare l'attributo always_inline, ad esempio:

void foo() __attribute__((always_inline)); 

Dal docs

always_inline In generale, le funzioni non sono inline a meno che non sia specificato ottimizzazione. Per le funzioni dichiarate in linea, questo attributo incorpora la funzione anche se non è stato specificato alcun livello di ottimizzazione.

Note1: Non c'è alcuna necessità di utilizzare inline se si utilizza l'attributo always_inline

Note2: Se la funzione non può essere inline si otterrà un messaggio di avviso, se per esempio la definizione non è disponibili durante la compilazione, tuttavia, ad un'ottimizzazione gcc più elevato può ancora inline nella chiamante, c'è un interruttore specifico anche per questo:

-funit-at-a-time 

Dalla docs:

livelli di ottimizzazione -O2 e, soprattutto, in particolare, consentono unità-at-a-time mode, che permette al compilatore di prendere in considerazione le informazioni acquisite dalle funzioni più avanti nel file durante la compilazione di una funzione . Compilare più file contemporaneamente su un singolo file di output in in modalità unità alla volta consente al compilatore di utilizzare le informazioni acquisite da tutti i file durante la compilazione di ciascuno di essi.

Nota3: Non è necessario avere un prototipo esplicita in modo da poter utilizzare l'attributo sulla funzione defintion:

__attribute__((always_inline)) void foo() { 
    //some code 
} 

Vedi anche discussion, essa risponde ad alcune delle vostre domande.

+0

funziona anche quando la definizione della funzione non è disponibile quando viene compilata una determinata unità? come fa il compilatore a gestire tale situazione .. – sgupta

+1

@ user1075375 come può la definizione di una funzione non essere disponibile? deve essere lì altrimenti non compilerà/collegherà – iabdalkader

+1

"Se un'implementazione di funzione non è nel file di intestazione e in un'unità di compilazione separata, non può essere in linea a meno che non si disponga di un compilatore che può eseguire LTCG" da http: // stackoverflow.com/questions/5187735/how-to-inline-string-h-function-on-linux?rq = 1 – sgupta

Problemi correlati