случай переключателя, по сравнению с если еще [дубликат]

Эти ошибки являются ошибками до C ++ 17. До C ++ 17 аргумент / параметр шаблона шаблона должен точно соответствовать.

Но так как добавление P0522R0 к стандарту, правило менее строгое, и этот код компилируется.

На сегодняшний день, я думаю, что только GCC реализует его, и вам нужно указать стандарт: gcc -std=c++17 см. Здесь .

10
задан Jose Vega 12 October 2008 в 18:21
поделиться

3 ответа

Компилятор будет иногда превращать переключатель в таблицу переходов, если записи будут непрерывны (или почти так). Или это могло теоретически использовать двоичный поиск для нахождения случая вместо линейной последовательности тестов, которые были бы быстрее, если бы у Вас было большое количество случаев.

С другой стороны, нет ничего мешающего компилятору делать те же оптимизации на том же коде, преобразованном в если/еще.

Таким образом на хорошем компиляторе, переключатель может быть быстрее в некоторых случаях. На очень хорошем компиляторе они были бы тем же.

10
ответ дан 3 December 2019 в 22:40
поделиться

В этом конкретном случае, switch может быть превращен в таблицу переходов. if оператор (если Вы пишете Ваш = как == :-P), мог все еще сделать то же самое, если компилятор мог бы сказать это x не изменяется между if пункты (который обычно имеет место, если x volatile или что-то).

2
ответ дан 3 December 2019 в 22:40
поделиться

Обратите внимание также, что, если/еще конструкция может быть более эффективной, если Вы знаете, определенные случаи более вероятны, чем другие.

3
ответ дан 3 December 2019 в 22:40
поделиться