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;
}
Non correlato, ma gli identificatori che iniziano con un trattino basso seguito da una lettera maiuscola sono riservati al compilatore. – GManNickG
Non dovrebbe essere allegato alla definizione __attribute __ ((noinline)? – jpalecek
@jpalecek: non è un errore di compilazione – user176168