2011-01-09 10 views
6

Diese Frage wurde zu Tode getan, und ich würde zustimmen, dass enums der Weg zu gehen sind. Allerdings bin ich neugierig, wie Enums in den endgültigen Code kompilieren - #defines sind nur String-Ersetzungen, aber fügen Enums etwas zu der kompilierten binary hinzu? Oder sind sie in dieser Phase beide gleichwertig? Wenn das Schreiben von Firmware und Arbeitsspeicher sehr begrenzt ist, gibt es einen Vorteil, egal wie klein, die Verwendung von #defines?#define vs enum in einer eingebetteten Umgebung (Wie kompilieren sie?)

Danke!

BEARBEITEN: Wie durch den Kommentar unten, durch eingebettet, ich meine eine Digitalkamera.

Danke für die Antworten! Ich bin alles für Enums!

+2

"Embedded" kann alles von einem Nexus S bis zu einem Avioniksystem bedeuten. Sie sollten es eingrenzen (welcher Chip, welcher Compiler, welche Version?), Wenn Sie eine sinnvolle Antwort wünschen. Ich stimme den Beantwortern zu, die * ähnlich * behandelt werden sollten. –

+1

@Matthew: Ich denke du denkst an C++. In C können 'define' und' enum' konstante Ausdrücke erzeugen, aber eine 'const'-Variable ist niemals ein konstanter Ausdruck und der Zugriff darauf wird fast sicher eine echte Code-Größe und Leistungseinbußen zur Folge haben (Laden aus dem Speicher). –

+0

@R, Sie haben recht, wenn ein 'const' in C99 kein const-Ausdruck ist (und ich muss das hier nachlesen). In einfachen Fällen kann der Compiler jedoch immer noch die Zuweisung von Speicher für sie vermeiden. Zum Beispiel, wenn ich in einem Header 'const int a = 1;' setze, dann ist 'int b = a; 'in main, der Compiler * kann schlau genug sein, Speicher für' a 'nicht zu reservieren. –

Antwort

10

Beide sind konstante Ausdrücke in der Terminologie der Norm, so dass sie „sollte“ vollständig von jedem vernünftigen Compiler zur Compile-Zeit ausgewertet werden. Es würde einen bösartig pathologischen Compiler benötigen, um anderen Code zu erzeugen.

+1

sie sind nicht nur * konstante Ausdrücke * sondern * ganzzahlige konstante Ausdrücke * in der Terminologie des Standards. Der Unterschied ist hier wichtig, da für das erste Beispiel eine Adreßkonstante ebenfalls geeignet wäre. Nur wenn sie der spätere sind, können sie in Typdeklarationen und für die Definition anderer 'enum'-Konstanten vorkommen. Als Array-Länge machen sie den Unterschied zwischen einfachen Arrays und VLA. –

5

Ein enum ist nur eine ganze Zahl. Der Compiler propagiert die Werte genauso wie für einen const.

+1

Ein 'enum'-Wert ist ein * konstanter Ausdruck *, während eine' const'-Variable (in C) nicht und somit nicht für statische Initialisierung verwendet werden kann, 'case'-Label, ...; ein 'enum'-Wert ist eine Kompilierzeitkonstante, eine' const'-Variable ist eine Laufzeitkonstante (aus der Perspektive der Sprache - der Compiler ist frei, konstante Propagierung für 'const'-Variablen zu machen) – Christoph

4

Es ist unmöglich zu sagen, ohne Profiling oder Messung auf andere Weise.

ABER, jeder ordentliche Compiler wird keinen signifikanten Unterschied zeigen. Darüber hinaus sollten Sie immer lesbaren, typsicheren Code gegenüber effizientem, unlesbarem, gotcha-behandeltem Code bevorzugen. Beginnen Sie nicht mit der Effizienz über die Lesbarkeit zu optimieren, bis Sie zwei Dinge bewiesen haben:

  1. Sie brauchen eigentlich die Effizienzsteigerung
  2. der Teil des Programms, Sie ändern gezeigt wurde, zu einem Engpass durch einen Profiler zu sein .
+1

stimme ich Ihnen völlig zu unnötige Optimierung! Ich bin gerade einem Projekt beigetreten und #define wurde benutzt, also habe ich mich gefragt, ob es einen Effizienzgrund geben könnte. –

+0

In diesem Fall müssen Sie wahrscheinlich keine Profilerstellung und Messungen vornehmen. Sehen Sie sich einfach die generierte Assembly an, die identisch sein sollte. –

+0

@Brooks ja. bearbeitet, um dies zu reflektieren. –