Хороший компилятор может и будет выбирать между таблицей прыжков, цепью if/else или комбинацией. Плохо разработанный компилятор не может сделать такой выбор - и даже может создать очень плохой код для коммутационных блоков. Но любой достойный компилятор должен создать эффективный код для блоков-переключателей. T
Основным фактором принятия решения здесь является то, что компилятор может выбрать, если/else, когда числа находятся далеко друг от друга [и не тривиально (например, деление на 2, 4, 8, 16, 256 и т. Д.) Изменено на более близкое значение] , например
switch(x)
{
case 1:
...
case 4912:
...
case 11211:
...
case 19102:
...
}
потребует таблицы перехода не менее 19102 * 2 байта.
С другой стороны, если числа близки друг к другу, компилятор обычно будет использовать jumptable.
Даже если это if/else
типа дизайна, он обычно будет делать «двоичный поиск» - если мы возьмем вышеприведенный пример:
if (x <= 4912)
{
if (x == 1)
{
....
}
else if (x == 4912)
{
....
}
} else {
if (x == 11211)
{
....
}
else if (x == 19102)
{
...
}
}
Если у нас есть много случаев, этот подход будет гнездо достаточно глубоко , и люди, вероятно, потеряются после трех или четырех уровней глубины (имея в виду, что каждый из них начинается в какой-то точке MIDDLE диапазона), но он уменьшает количество тестов с помощью log2 (n), где n является количество вариантов. Это, конечно, гораздо более эффективное, чем наивный подход
if (x == first value) ...
else if (x == second value) ...
else if (x == third value) ...
..
else if (x == nth value) ...
else ...
Это может быть немного лучше, если некоторые значения ставятся в начале, если-то еще цепи, но это предполагает, что вы можете определить, что является наиболее распространенной перед запуском кода.
Если производительность КРИТИЧЕСКОГО для вашего случая, вам необходимо сравнить два варианта. Но я предполагаю, что просто написать код в качестве переключателя сделает код более понятным и в то же время будет работать как минимум так быстро, если не быстрее.
1) Это, скорее всего, будет зависеть от вашего компилятора. Что вы используете? 2) Почему вас это волнует? Вы должны доверять своему компилятору, чтобы сделать все возможное, используя код, который вы пишете. Во всех случаях таблица перехода может быть не лучшим выбором. Не совсем ответит на ваш вопрос, но вас может заинтересовать http://ols.fedoraproject.org/GCC/Reprints-2008/sayle-reprint.pdf – BoBTFish
@BoBTFish: Спасибо за указатель, оцененный. –
@BoBTFish Спасибо, кажется, приятно читать, если у меня было только время (: –