2011-01-09 13 views
6

Questa domanda è stata fatta a morte e sono d'accordo che le enumerazioni siano la strada da percorrere. Tuttavia, sono curioso di sapere come enum compili nel codice finale. #defines sono solo sostituzioni di stringhe, ma le enumerazioni aggiungono qualcosa al binario compilato? O sono entrambi equivalenti in quella fase. Quando scrivere firmware e memoria è molto limitato, c'è qualche vantaggio, non importa quanto piccolo, usare i #defines?#define vs enum in un ambiente incorporato (come vengono compilati?)

Grazie!

MODIFICA: Come richiesto dal commento di seguito, per embedded, intendo una fotocamera digitale.

Grazie per le risposte! Sono tutto per enumerare!

+2

"Embedded" può significare qualsiasi cosa, da un Nexus S a un sistema avionico. Dovresti restringerlo (quale chip, quale compilatore, quale versione?) Se vuoi una risposta significativa. Sono d'accordo con i rispondenti che * dovrebbe * essere trattato come un 'const'. –

+1

@Matthew: Penso che stai pensando al C++. In C, '# define' e' enum' possono creare espressioni costanti, ma una variabile 'const' non è mai un'espressione costante, e accedervi quasi certamente incorre in dimensioni del codice reali e penalità prestazionali (caricandola dalla memoria). –

+0

@R, hai ragione su un 'const' non essendo un'espressione const in C99 (e ho bisogno di leggere su questo). Ma in casi semplici, il compilatore può ancora evitare di allocare memoria per loro. Per esempio, se metto 'const int a = 1;' in un'intestazione, quindi 'int b = a;' in main, il compilatore * potrebbe * essere abbastanza intelligente da non allocare memoria per 'a'. –

risposta

10

Entrambi sono espressioni costanti nella terminologia dello standard, in modo che "dovrebbe" essere valutati pienamente al momento della compilazione da qualsiasi compilatore sano di mente. Ci vorrebbe un compilatore maliziosamente patologico per generare codice diverso.

+1

non sono solo * espressioni costanti * ma * espressioni costanti intere * nella terminologia dello standard. La differenza è importante qui, dal momento che per la prima, anche una costante di indirizzo si qualificherebbe. Solo essendo più tardi, possono apparire in dichiarazioni di tipo e per la definizione di altre costanti 'enum'. E utilizzati come lunghezza dell'array fanno la differenza tra array semplici e VLA. –

5

Un enum è solo un numero intero, in definitiva. Il compilatore propaga i valori, proprio come farebbe per un const.

+1

un valore 'enum' è una * espressione costante *, mentre una variabile' const' (in C) non lo è e quindi non può essere utilizzata per l'inizializzazione statica, etichette 'case', ...; un valore 'enum' è una costante in fase di compilazione, una variabile' const' è una costante di runtime (dal punto di vista del linguaggio - il compilatore è libero di fare propagazione costante per le variabili 'const') – Christoph

4

È impossibile dire senza profilatura o misurazione in qualche altro modo.

MA, qualsiasi compilatore decente non mostrerà alcuna differenza significativa. Inoltre, dovresti sempre preferire codice leggibile e digitato sopra codice efficiente, illeggibile, gotcha-ride. Non iniziare a ottimizzare l'efficienza nel corso leggibilità fino a quando si hanno dimostrato due cose:

  1. hai veramente bisogno la spinta di efficienza
  2. la parte del programma che si sta modificando ha dimostrato di essere un collo di bottiglia da un profiler .
+1

Sono completamente d'accordo con te su ottimizzazione non necessaria! Mi sono appena iscritto a un progetto e #define era in uso, quindi mi chiedevo se potesse esserci un motivo di efficienza. –

+0

In questo caso, probabilmente non è necessario eseguire il profiling e la misurazione in quanto tali: basta osservare l'assembly generato, che dovrebbe essere identico. –

+0

@Brooks si. modificato per riflettere questo. –