Эффективный оператор switch при использовании перечислений
У меня есть enum и оператор switch, использующий некоторые записи enum, но не все, и в настоящее время они тоже вышли из строя, т.е. у меня есть следующее:
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 - хотя компилятор может справиться с этим, перейдя к смещению n - 1
).
Вы можете проверить выходные данные компилятора, чтобы увидеть, создается ли таблица переходов (при условии, что вы можете прочитать сборку!). И, конечно же, ответ на все вопросы производительности: профиль!
Я не могу говорить о diab
компилятор, потому что я не знаком с ним, но оптимизирующий компилятор, скорее всего, создаст таблицу переходов для switch
заявление за enum
, Так что порядок не имеет значения. Сказав это, вы не должны беспокоиться о таких тривиальных вещах. Поправь меня, если я неправильно понял твой вопрос.