Sto pensando al seguente problema: Voglio programmare un microcontrollore (diciamo un tipo mega AVR) con un programma che utilizza una sorta di tabelle di ricerca.Come rendere GCC valutare le funzioni in fase di compilazione?
Il primo tentativo sarebbe quello di individuare la tabella in un file separato e crearla utilizzando qualsiasi altro linguaggio di scripting/programma/.... In questo caso c'è un po 'di sforzo per creare i file di origine necessari per C.
Il mio pensiero era ora di utilizzare il preprocessore e il compilatore per gestire le cose. Ho cercato di realizzare questo con una tabella di valori del seno (solo come esempio):
#include <avr/io.h>
#include <math.h>
#define S1(i,n) ((uint8_t) sin(M_PI*(i)/n*255))
#define S4(i,n) S1(i,n), S1(i+1,n), S1(i+2,n), S1(i+3,n)
uint8_t lut[] = {S4(0,4)};
void main()
{
uint8_t val, i;
for(i=0; i<4; i++)
{
val = lut[i];
}
}
Se compilo questo codice ottengo avvertimenti sulla funzione sin
. Inoltre nel montaggio non c'è nulla nella sezione .data
. Se rimuovo lo sin
nella terza riga, ottengo i dati nell'assieme. Chiaramente tutte le informazioni sono disponibili al momento della compilazione.
Puoi dirmi se esiste un modo per ottenere ciò che intendo: il compilatore calcola quanti valori sono possibili offline? O è il modo migliore per utilizzare uno script/programma/... esterno per calcolare le voci della tabella e aggiungerle a un file separato che sarà semplicemente #include
d?
"un po 'di sforzo." - con un buon scripting linguaggio? certamente meno, che attaccare il problema con C .... –
C++ 11 (migliorato con C++ 14) ha 'constexpr' come suggerimento al compilatore per eseguire una funzione in fase di compilazione. – johannes
@johannes: 'constexpr' non è un vantaggio. Fornisce semplicemente _allows_ un'espressione valutata al momento della compilazione (e anche costringendo il compilatore a farlo, ad esempio assegnando a un'enumerazione non impedisce di rivalutare in fase di esecuzione in una posizione diversa nello stesso file sorgente!). Non impone o suggerisce nulla. Detto questo, il mio GCC ottimizza lo snippet di codice nell'OP proprio in una tabella di ricerca valutata dal compilerime (senza particolari danze speciali). – Damon