2011-01-09 23 views
6

To pytanie zostało zrobione na śmierć i zgodziłbym się, że wyliczenia są drogą do zrobienia. Jednak jestem ciekawy, w jaki sposób enumy kompilują się w ostatecznym kodzie - #definy są po prostu zamianą ciągów, ale czy enumy dodają coś do skompilowanego pliku binarnego? A może oba są równoważne na tym etapie? Kiedy pisanie oprogramowania układowego i pamięci jest bardzo ograniczone, czy jest jakaś korzyść, nieważne jak mała, do używania #defines?#define vs enum w środowisku osadzonym (w jaki sposób się kompilują?)

Dzięki!

EDYCJA: Zgodnie z prośbą o komentarz poniżej, przez osadzone, mam na myśli aparat cyfrowy.

Dzięki za odpowiedzi! Jestem za wyliczeniem!

+2

"Wbudowany" może oznaczać wszystko, od Nexusa S do systemu awioniki. Powinieneś go zawęzić (który układ, który kompilator, która wersja?), Jeśli chcesz uzyskać sensowną odpowiedź. Zgadzam się z odpowiedziami, które * powinno * być traktowane podobnie do "const". –

+1

@Matthew: Myślę, że myślisz o C++. W języku C '# define' i' enum' mogą tworzyć wyrażenia stałe, ale zmienna 'const' nigdy nie jest wyrażeniem stałym, a uzyskanie dostępu do niej prawie na pewno spowoduje wystąpienie rzeczywistego rozmiaru kodu i kar za wydajność (ładowanie go z pamięci). –

+0

@R, masz rację co do 'const' nie będącego wyrażeniem const w C99 (i muszę to przeczytać). Ale w prostych przypadkach kompilator nadal może unikać przydzielania pamięci. Na przykład, jeśli wstawię 'const int a = 1;' w nagłówku, to 'int b = a;' w main, kompilator * może * być wystarczająco inteligentny, aby nie przydzielić pamięci dla 'a'. –

Odpowiedz

10

Oba są wyrażenia stałe w terminologii standardu, więc oni „powinno” być w pełni ocenione w czasie kompilacji przez każdego rozsądnego kompilator. Wymagałoby złośliwie patologicznego kompilatora do wygenerowania innego kodu.

+1

są to nie tylko * wyrażenia stałe *, ale * stałe wyrażenia całkowite * w terminologii standardu. Różnica jest tutaj ważna, ponieważ dla pierwszej, np. Stała adresowa również by się kwalifikowała. Tylko jako późniejsze mogą pojawiać się w deklaracjach typu i dla definicji innych stałych "wyliczeniowych". I używane jako długość tablicy, robią różnicę między zwykłymi tablicami a VLA. –

5

W końcu enum to po prostu liczba całkowita. Kompilator propaguje wartości, tak jak w przypadku const.

+1

Wartość 'enum' jest * stałym wyrażeniem *, podczas gdy zmienna' const' (w C) nie jest i dlatego nie może być używana do statycznej inicjalizacji, etykiet 'case', ...; wartość 'enum' jest stałą czasu kompilacji, zmienną' const' jest stała środowiska wykonawczego (z perspektywy języka - kompilator może wykonywać stałą propagację zmiennych 'const') – Christoph

4

Nie da się powiedzieć bez profilowania lub mierzenia w inny sposób.

ALE żaden przyzwoity kompilator nie będzie wykazywał żadnej znaczącej różnicy. Co więcej, zawsze powinieneś preferować czytelny, bezpieczny dla użytkownika kod nad wydajnym, nieczytelnym, kodowanym haschem. Nie zaczynaj optymalizacji dla efektywności nad czytelnością aż okazały dwie rzeczy:

  1. rzeczywiście potrzebne do zwiększenia wydajności
  2. część programu Zmieniasz Wykazano być wąskim gardłem przez profilera .
+1

Całkowicie się z Tobą zgadzam niepotrzebna optymalizacja! Właśnie dołączyłem do projektu i #define był używany, więc zastanawiałem się, czy może być przyczyna efektywności. –

+0

W tym przypadku prawdopodobnie nie trzeba wykonywać profilowania i pomiarów jako takich - wystarczy spojrzeć na wygenerowany zespół, który powinien być identyczny. –

+0

@ Brooks tak. zredagowane, aby to odzwierciedlić. –