I compilatori C/C++ ottimizzano le funzioni a livello singolo con parametri costanti (noti al momento della compilazione) solo quando si utilizzano -Os, -O1 e -O2. Non ottimizzano tutti i livelli. Solo -O3 può farlo. gcc è WinAVR 4.3.3 che non supporta l'attributo "ottimizzare".c/C++ ottimizzazione per variabile costante nelle funzioni di chiamata
void inner(double value)
{
//operations using value
//...
}
void outer(double value)
{
//few operations using value
//...
inner(value);
}
int main()
{
inner(1); //optimize
outer(1); //only optimize by using -O3
}
Quali sono le possibili soluzioni oltre ai seguenti?
- -O3 programma di attesa o di file (uso improprio farà saltare in aria la dimensione)
- attribuiscono ottimizzare -O3 per le funzioni (4.3.3 non supporta)
- macro (soggetto a errori)
Aggiornamento:
//inner function
static inline void _delay_us(double __us) __attribute__((always_inline));
//outer function
void f(double);
inline f1(double);
static inline f2(double);
static f3(double);
f1 è ottimizzato b ut avvertimento '_delay_us' è statico ma viene utilizzato nella funzione inline 'f1' che non è statica a causa di problemi di funzione statica. Altri non sono ottimizzati.
Soluzione:
static inline void outer(double) __attribute__((always_inline));
Inline è la chiave. La mia funzione esterna è troppo grande per essere in linea. L'attributo always_inline impone che la funzione sia in linea. Ciò consente al compilatore di ottimizzare la funzione con un costo di compilazione inferiore rispetto al tentativo di calcolare l'ottimizzazione. -O3 è abbastanza intelligente da fare l'ottimizzazione ma non -Os. -Os potrebbe richiedere alcune opzioni del compilatore. (La parola chiave static è necessaria perché la funzione interna è anche statica in linea.)
Hm, non sono sicuro di capire perché questo è un problema. Se vuoi che il compilatore ottimizzi, diglielo. Se temi che '-O3' (o qualsiasi altro livello) faccia esplodere la dimensione del tuo codice,' -Os' è solo la strada da percorrere. –
Il codice viene utilizzato nei microcontrollori a 8 bit che non hanno l'ALU in virgola mobile hardware. -O3 in effetti danno una dimensione del codice più piccola di -Os in questa funzione, 4k vs 400 – keithyip