ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Среда
8 мая
1374938 Топик полностью
Eddy_Em (23.11.2023 23:19, просмотров: 98) ответил IBAH на Как свитч работает я прекрасно понимаю. Я одно не понимаю хватит ли ума у компилятора, цепочку ифов заменить свитчем?
Ну, а почему бы не проверить? Берем простейший код 
#include <stdio.h>
#include <stdlib.h>

typedef enum{
    case1, case2, case3, case4, case5
} cases;

int f1(cases c){
    int i = 0;
    switch(c){
        case case1: i = 1; break;
        case case2: i = 2; break;
        case case3: i = 3; break;
        case case4: i = 4; break;
        case case5: i = 5; break;
    }
    return i;
}

int f2(cases c){
    int i = 0;
    if(c == case1) i = 1;
    else if(c == case2) i = 2;
    else if(c == case3) i = 3;
    else if(c == case4) i = 4;
    else if(c == case5) i = 5;
    return i;
}

int main(int argc, char **argv){
    cases i = atoi(argv[1]);
    printf("f1(%d)=%d\n", i, f1(i));
    printf("f2(%d)=%d\n", i, f2(i));
    return 0;
}

и смотрим, что там в асме будет.

for ((i=0; i<4; ++i)); do gcc -O$i 1.c -S -o testO${i}.s; done

С O0 он свич именно по таблице сделал, а ифы тупо так ифами и оставил.

С O1 свич тоже табличный, но "прелюдия" функции короче. Зато ифы он полностью аналогично - заменил свичами.

С O2 этот говнюк тупо в свичах отнял единицу от аргумента и отправил в ответ (а если входной аргумент за пределами положенного - возвращает нуль). Полностью аналогично выглядит с ифами.

У O3 вообще никакой разницы с О2 нет.


Вывод: gcc при необходимости не только if'ы на свичи заменяет, так еще и хитрожопить может!

eddy-em.livejournal.com github.com/eddyem