2011-01-09 3 views
6

Этот вопрос был до смерти, и я согласен с тем, что перечисления - это путь. Тем не менее, мне любопытно, как перечисления перечисляются в окончательном коде - #defines - это просто замены строк, но перечисляют ли перечисления что-либо в скомпилированный двоичный файл? Или они оба эквивалентны на этом этапе. При написании прошивки и памяти очень ограничено, есть ли какое-либо преимущество, независимо от того, насколько мало, использовать #defines?#define vs enum во встроенной среде (как они скомпилируются?)

Спасибо!

EDIT: В соответствии с комментарием ниже, встроенным я имею в виду цифровую камеру.

Спасибо за ответы! Я все перечислил!

+2

«Встроенный» может означать что угодно: от Nexus S до системы авионики. Вы должны сузить его (какой чип, какой компилятор, какая версия?), Если вы хотите иметь конструктивный ответ. Я согласен с тем, что ответчики должны * относиться к «const». –

+1

@Matthew: Думаю, вы думаете о C++. В C '# define' и' enum' могут создавать константные выражения, но переменная 'const' никогда не является постоянным выражением, и доступ к ней почти наверняка повлечет за собой реальные размеры кода и штрафы за производительность (загрузка из памяти). –

+0

@R, вы правы в том, что 'const' не является выражением const в C99 (и мне нужно прочитать об этом). Но в простых случаях компилятор все же может избежать выделения памяти для них. Например, если я помещаю 'const int a = 1;' в заголовок, тогда 'int b = a;' в main, компилятор * может * быть достаточно умным, чтобы не выделять память для 'a'. –

ответ

10

Оба константные выражения в терминологии стандарта, так что они «должны» быть в полной мере оценены во время компиляции с помощью любого нормального компилятора. Для генерации другого кода понадобится вредоносный патологический компилятор.

+1

это не только * постоянные выражения *, но и целые константные выражения * в терминологии стандарта. Разница здесь важна, поскольку для первой, например, константа адреса также будет квалифицироваться. Только будучи более поздними, они могут появляться в объявлениях типов и для определения других констант enum. И используются как длина массива, они делают разницу между равными массивами и VLA. –

5

enum - это просто целое число, в конечном счете. Компилятор распространяет значения так же, как и для const.

+1

Значение 'enum' является * постоянным выражением *, тогда как переменная' const' (в C) не является и, следовательно, не может использоваться для статической инициализации, 'case' labels, ...; значение «enum» является константой времени компиляции, переменная 'const' является константой времени выполнения (с точки зрения языка - компилятор свободен для постоянного распространения для переменных' const') – Christoph

4

Невозможно сказать без профилирования или измерения каким-либо другим способом.

НО, любой достойный компилятор не покажет существенных различий. Кроме того, вы всегда должны отдавать предпочтение считываемому, типизированному коду по эффективному, нечитаемому, закодированному коду. Не начинайте оптимизации для повышения эффективности по читаемости, пока вы не доказали две вещи:

  1. вы на самом деле нужно импульс эффективности
  2. часть программы, которую вы меняющегося было показано, что узким местом профилировщику ,
+1

Я полностью согласен с вами ненужная оптимизация! Я просто присоединился к проекту, и #define использовался, поэтому мне было интересно, может ли быть причина эффективности. –

+0

В этом случае вам, вероятно, не нужно выполнять профилирование и измерение как таковое - просто посмотрите на сгенерированную сборку, которая должна быть идентичной. –

+0

@Brooks да. отредактирован, чтобы отразить это. –

 Смежные вопросы

  • Нет связанных вопросов^_^