эффективный оператор switch при использовании перечислений
У меня есть перечисление и оператор switch, использующие некоторые из записей перечисления, но не все, и они в настоящее время тоже не в порядке, т. е. у меня есть следующее:
enum prot_tun_stat_e {
STAT_A = 0,
STAT_B,
STAT_C,
STAT_D,
STAT_E,
STAT_F, //5
STAT_G,
STAT_H,
STAT_I,
STAT_Y,
STAT_K, //10
STAT_COUNT //must be last
} __attribute__((packed));
И затем у меня есть переключатель, использующий следующие записи:
switch(var) {
case C:
break;
case D:
break
case F:
break
case G:
break
default
}
И я подумал, не лучше ли мне переставить элементы в перечислении, чтобы они были C=1,D=2,F=3&G=4
? Будет ли это более эффективно?
Спасибо, Рон
Платформа: PowerPC
, компилятор diab
2 ответа:
Если компилятор может определить, что параметр оператора switch ограничен небольшим числом, то он может создать таблицу переходов . Эта таблица займет меньше места, если значения будут смежными, но разница между 4 записями или 10 требуемыми вряд ли будет иметь значение. (И обратите внимание, что 0-3-это лучший диапазон, чем 1-4 , хотя компилятор может справиться с этим, перейдя к offset
n - 1
).Вы можете проверить выходные данные компилятора, чтобы увидеть, выполняется ли таблица переходов. создано (предполагая, что вы можете прочитать сборку!). И конечно же ответ на все вопросы производительности: профиль его!
Я не могу говорить о компиляторе
diab
, потому что я не знаком с ним, но оптимизирующий компилятор, скорее всего, создасттаблицу переходов для оператораswitch
надenum
. Так что приказ не имеет значения. Сказав это, вы не должны беспокоиться о таких тривиальных вещах. Поправьте меня, если я неправильно понял ваш вопрос.