Эффективный оператор 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, Так что порядок не имеет значения. Сказав это, вы не должны беспокоиться о таких тривиальных вещах. Поправь меня, если я неправильно понял твой вопрос.

Другие вопросы по тегам