Почему оператор переключения и не, если еще?

60
задан Community 23 May 2017 в 12:26
поделиться

7 ответов

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

Ниже некоторые чрезвычайно упрощенные примеры psuedo-блока. Во-первых, если еще версия:

    // C version
    if (1 == value)
        function1();
    else if (2 == value)
        function2();
    else if (3 == value)
        function3();

    // assembly version
    compare value, 1
    jump if zero label1
    compare value, 2
    jump if zero label2
    compare value, 3
    jump if zero label3
label1:
    call function1
label2:
    call function2
label3:
    call function3

Следующий версия переключателя:

    // C version
    switch (value) {
    case 1: function1(); break;
    case 2: function2(); break;
    case 3: function3(); break;
    }

    // assembly version
    add program_counter, value
    call function1
    call function2
    call function3

Вы видите, что получающийся ассемблерный код намного более компактен. Обратите внимание, что значение должно было бы быть преобразовано в некотором роде для обработки других значений, чем 1, 2 и 3. Однако это должно проиллюстрировать понятие.

88
ответ дан Judge Maygarden 24 November 2019 в 17:39
поделиться

Переключатель может быть оптимизирован компиляцией r - Вы получите более быстрый код.
Также я нахожу, что он более изящен при контакте с перечислимыми типами.

Для подведения переключатель оператор дает Вам производительность + элегантность кода :)

Вот некоторые полезные ссылки:

23
ответ дан aku 24 November 2019 в 17:39
поделиться

Для выразительности переключатель/оператор выбора позволяет Вам собирать в группу несколько случаев, например:

case 1,2,3: do(this); break;
case 4,5,6: do(that); break;

Для производительности, компиляторы могут иногда оптимизировать операторы переключения в таблицы переходов.

7
ответ дан jdigital 24 November 2019 в 17:39
поделиться

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

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

7
ответ дан Darron 24 November 2019 в 17:39
поделиться

Помимо другой упомянутой удобочитаемости Code и оптимизации в.NET Вы также получаете способность включить перечисления и т.д.

enum Color { Red, Green, Blue }; 

Color c = Color.Red;

switch (c) // Switch on the enum

{

// no casting and no need to understand what int value it is

case Color.Red:    break;
case Color.Green:  break;
case Color.Blue:   break;

}
4
ответ дан Justin King 24 November 2019 в 17:39
поделиться

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

3
ответ дан Marc Charbonneau 24 November 2019 в 17:39
поделиться

Переключатель может быть оптимизирован "Лучше" некоторыми компиляторами. Существуют ловушки с использованием оператора переключения на определенных языках. В Java переключатель не может обработать строки, и в VB2005 оператор переключения не будет работать с переключателями.
Переключатель может быть быстрее и легче читать, Если тогда более универсально и будет работать в большем количестве мест.

2
ответ дан WolfmanDragon 24 November 2019 в 17:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: