эффективный оператор 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 2

2 ответа:

Если компилятор может определить, что параметр оператора switch ограничен небольшим числом, то он может создать таблицу переходов . Эта таблица займет меньше места, если значения будут смежными, но разница между 4 записями или 10 требуемыми вряд ли будет иметь значение. (И обратите внимание, что 0-3-это лучший диапазон, чем 1-4 , хотя компилятор может справиться с этим, перейдя к offset n - 1).

Вы можете проверить выходные данные компилятора, чтобы увидеть, выполняется ли таблица переходов. создано (предполагая, что вы можете прочитать сборку!). И конечно же ответ на все вопросы производительности: профиль его!

Я не могу говорить о компиляторе diab, потому что я не знаком с ним, но оптимизирующий компилятор, скорее всего, создасттаблицу переходов для оператора switch над enum. Так что приказ не имеет значения. Сказав это, вы не должны беспокоиться о таких тривиальных вещах. Поправьте меня, если я неправильно понял ваш вопрос.