2013-05-27 17 views
6

Sono rimasto molto impressionato nel vedere l'ultimo esempio in metaprogramming guide di Todd Veldhuizen in cui le funzioni trig come sin e cos sono calcolate in fase di compilazione. Per essere onesti, mi ha sconvolto e se stai scrivendo un codice che esegue un numero enorme di questi in loop, come lo sono io, questo potrebbe avere un effetto sostanziale sull'aumento delle prestazioni.Quali operatori matematici sono disponibili in metaprogrammazione

Domanda 1

Tuttavia, mi ha portato a chiedersi dove viene disegnata la linea tra ciò che è disponibile come strumento di run-time (chiamando effettive funzioni di libreria matematica come sin o cos) e ciò che è disponibile come solo un operatore matematico in fase di compilazione.

L'esempio di Todd deve calcolare manualmente la funzione trigonometrica utilizzando solo l'aritmetica ordinaria.

sono io supporre allora che un compilatore è in grado di tutte le funzioni matematiche ordinarie *+-/ ma niente altro?

Domanda 2

In tal caso, si sarebbe solo in grado di ottenere risultati compilazione in tempo per sin e cos calcoli su numeri interi, giusto? Cioè, non puoi precompilare il risultato di qualcosa come sin 45.5, corretto?

O forse, se il modello può accettare solo numeri interi come parametri, è possibile richiedere diversi numeri interi e fare un float fuori di essi nella classe, come passare 123 e facendo 1.23 per ottenere il sin di un valore float.

risposta

2

Domanda 1

Tuttavia, mi ha portato a chiedersi dove viene disegnata la linea tra ciò che è disponibile come strumento di run-time (chiamando effettive funzioni di libreria matematica come sin o cos) e ciò che è disponibile come solo un operatore matematico in fase di compilazione.

  • funzioni possano essere utilizzate solo in caso di compiletime se sono dichiarati constexpr, obbedire alle regole del constexpr e sono chiamati con costanti compiletime.
  • I tipi di dati definiti dall'utente possono essere utilizzati al momento della compilazione solo se sono costruiti tramite costruttori constexpr da costanti compiletime.
  • Qualsiasi operatore incorporato che operi su tipi di unità costanti di tipo costante fornisce una costante costante.
  • Qualsiasi tipo di conversione tra builtin fornisce una costante costante, se l'originale è una costante costante.

Quindi, non è limitato ai quattro operatori matematici, è possibile utilizzare % e altri operatori, nonché, così come METAFUNCTIONS modello e constexpr espressioni.

Domanda 2

In tal caso, si sarebbe solo in grado di ottenere risultati compilazione in tempo per il peccato e cos calcoli su numeri interi, giusto? Cioè, non puoi precompilare il risultato di qualcosa come sin 45.5, corretto?

Sì e no. In C++ 03 sei limitato ai builtin e ai metafunzioni del modello, constexpr non è disponibile. Il sin deve pertanto essere una metafunzione del modello che può funzionare solo su costanti integrali, poiché i tipi a virgola mobile non sono consentiti nei modelli. Potresti comunque definire modelli per frazioni o valori a virgola fissa e trovare un modello sin per quelli. Sarebbe piuttosto noioso e potresti facilmente finire con i limiti di istanziazione del modello.

Dal C++ 11 è possibile scrivere le funzioni constexpr che prendono i parametri in virgola mobile e funzionano con quelli.

+1

Per il calcolo sinusoidale in fase di compilazione con espansione in serie, consultare http://www10.informatik.uni-erlangen.de/~pflaum/pflaum/ProSeminar/meta-art.html – jmihalicza

Problemi correlati