Лет 7 назад я придумал как можно проверять значение int за O(1). Тогда я подумал что можно просто разделить программу на одинаковые по размеру блоки и прыгнуть на соответствующий. Мне не было известно об устройстве switch, да и ассемблер я не знал.
Уже спустя пару лет я понял, что современный switch как раз этим и занимается, но только вчера я проверил, что теория сошлась с практикой.
Виной всему послужил доклад с cppcon:
Посмотрев на switch со слайдов, я вспомнил про свою старую идею и полез на godbolt проверять.
https://godbolt.org/z/uMkkfV
Собственно, все достаточно оптимально выглядит на ассемблере. Странно только, что clang вставил команду xor rax, 128. Из-за этого ему также пришлось перелопатить таблицу значений. gcc этим заниматься не стал, а сгенерировал как раз максимально ожидаемый код.
Потом я, правда, вернулся к докладу, который оказался просто божественным. В магию goto я не поверил, но оно работает в современном gcc даже при std=c++98:
int main() {
void* exitAddress = &&L1;
goto* exitAddress;
return 1;
L1:
return 0;
}
Кто это придумал, и значем это нужно, по-прежнему остается загадкой.