static double m = 30000;
double foo(double x, double y) {
return x/m + y;
}
Questo non ti porta nulla. Una copia di m deve essere fatta per fare il calcolo. Anche se si fa:
double bar(double x, double y) {
m += x + y;
return m;
}
Poi tutte le chiamate al bar cambierà m. Le variabili statiche al di fuori delle funzioni (o delle classi) sono in realtà delle variabili globali con ambito file. Altri file non possono ottenerli dall'esterno
Le variabili statiche all'interno di una funzione sono ancora come variabili globali, tranne che anche altre funzioni nello stesso file non possono vederle direttamente.
const double m = 30000;
Questo è migliore e in molti casi migliore. Se il compilatore vede questo const globale e quindi vede un riferimento a m, allora sa che piuttosto che generare codice per caricare il valore da dove è (che probabilmente richiede il caricamento di un indirizzo letterale in un registro prima) in un registro o in una posizione di stack per fare calcoli può semplicemente fare in modo che un registro sia 30000 o talvolta generare un'istruzione con 30000 codificata proprio lì.
Il lato negativo di questo è che il compilatore deve presupporre che altri file souce vorranno leggere m e deve effettivamente archiviare una copia come variabile (ma una variabile costante) nel file oggetto.
Non sono sicuro che sia standard ma a volte è possibile eseguire extern const double m = 30000;
e il compilatore utilizzerà 30000 per ottimizzare e presupporre che un altro file abbia effettivamente una copia di m che verrà archiviata nell'eseguibile. Puoi anche fare static const double m = 30000;
e il compilatore può supporre che nessun altro si aspetterà che una copia di m sia memorizzata nel codice oggetto generato da questo file sorgente.
Facendo
#define m 30000
è più rischioso. Non riceverai un avviso o un errore se in precedenza c'era un'altra m dichiarata come variabile, costante o funzione. Inoltre, per i macro del preprocessore come questo è facile fare confusione. Per esempio:
#define BASE_ADDRESS 48
#define MY_OFFSET 9
#define MY_ADDRESS BASE_ADDRESS+MY_OFFSET
...
return MY_ADDRESS*4;
Sì, questo è un esempio stupido, ma che cosa questo sembra dopo che il preprocessore viene fatto con esso è
...
return 48+9*4;
Qual è
return 48+(9*4);
E questo è non quello che probabilmente volevi.
Un altro punto in cui le macro sono errate è quando si hanno costanti grandi, come le stringhe. Le stringhe richiedono che siano indirizzabili da un puntatore e sono più difficili da ottimizzare rispetto agli interi e ai numeri letterali o costanti in virgola mobile. Si potrebbe facilmente fare un grande programma se tu avessi un sacco di roba del genere:
#define JIM "Jim"
#define JOHN "John"
e poi utilizzato JIM e John in tutto i programmi perché il compilatore potrebbe non essere in grado di vedere che si ha realmente bisogno solo le stringhe " Jom "e" John "una volta nel programma.
Detto questo, non è raro vedere costanti dichiarate in quel modo, e spesso vengono fatte correttamente in quel modo da persone che sanno cosa stanno facendo.
Grazie a tutti per le risposte interessanti. Quindi penso che la cosa migliore nel mio caso sia avere const stat double = 30000. – yCalleecharan