2010-03-16 34 views
6

Sto utilizzando gcc con l'ottimizzazione delle funzioni -finline per i build di rilascio. Al fine di combattere il codice gonfiato perché lavoro su un sistema embedded, voglio dire non funzioni inline particolari. Il modo più ovvio per farlo è attraverso attributi di funzioni, ad esempio l'attributo (noinline). Il problema è che non sembra funzionare quando accendo l'ottimizzazione delle funzioni globali -finline che fa parte dell'interruttore -O3.gcc -finline-functions comportamento?

Ha anche qualcosa a che fare con il suo modello, poiché una versione non basata della stessa funzione non viene inserita come previsto.

Qualcuno ha idea di come controllare l'inlining quando questo interruttore globale è attivo?

Ecco il codice:

#include <cstdlib> 
#include <iostream> 

using namespace std; 

class Base 
{ 
public: 

    template<typename _Type_> 
    static _Type_ fooT(_Type_ x, _Type_ y) __attribute__ ((noinline)); 
}; 

template<typename _Type_> 
_Type_ Base::fooT(_Type_ x, _Type_ y) 
{ 
    asm(""); 
    return x + y; 
} 


int main(int argc, char *argv[]) 
{ 
    int test = Base::fooT(1, 2); 
    printf("test = %d\n", test); 

    system("PAUSE"); 
    return EXIT_SUCCESS; 
} 
+1

Non correlato, ma gli identificatori che iniziano con un trattino basso seguito da una lettera maiuscola sono riservati al compilatore. – GManNickG

+0

Non dovrebbe essere allegato alla definizione __attribute __ ((noinline)? – jpalecek

+0

@jpalecek: non è un errore di compilazione – user176168

risposta

4

Il docs for GCC's noinline dire:

Questo attributo funzione impedisce una funzione da essere considerato per inlining. Se la funzione non ha effetti collaterali, ci sono ottimizzazioni diverse dalla inlining che causano l'ottimizzazione delle chiamate di funzione, sebbene la chiamata alla funzione sia live. Per mantenere tali chiamate di essere ottimizzato via, mettere

 asm (""); 

(vedi estesa Asm) nella funzione chiamata, per servire come uno speciale effetto collaterale

Penso che quello che potrebbe accadere a voi è che poiché la funzione Base::fooT<> non ha effetti collaterali, GCC sta richiamando le altre ottimizzazioni non specificate menzionate sopra.

+0

Ci scusiamo per il lungo ritardo nella risposta! No, purtroppo gcc lo ha ancora in linea, l'avevo provato prima. Sto usando 4.1.1 qualcuno sa di un bug relativo a questo? Grazie per la risposta, però, non sembra che ci sia un sacco di conoscenze su questo argomento ... – user176168

1

Prova a mettere l'attributo noinline dopo la static e prima della definizione in questo modo:

template<typename _Type_> 
    static __attribute__ ((noinline)) _Type_ fooT(_Type_ x, _Type_ y); 

Questo ha funzionato per me e sembra funzionare anche per gli altri, vedi: How can I tell gcc not to inline a function?

Per qualche motivo doesn Non è possibile applicare l'attributo noinline dopo la funzione o inserendo il numero asm("") nel corpo della funzione, nonostante ciò che dice la documentazione gcc.

1

Poco vecchio thread, ma vale la pena rispondere. Se nulla di sopra funziona per te, c'è sempre una soluzione semplice. È necessario nascondere l'implementazione dall'unità di traduzione in cui si desidera utilizzare tale metodo inserendolo in un altro file cpp.

EDIT

In GCC> = 4,5 v'è un attributo noclone che sostituiscono noinline in modo di specializzarsi funzione.

Problemi correlati