Есть ли польза от использования «return» против «break» в конструкции Switch-Case? - PullRequest
0 голосов
/ 09 июня 2019

Я изучаю код для 32-битного MCU, в котором я вижу конструкцию Switch-case, которая использует только «return» внутри каждого случая вместо обычного оператора «break».Какая польза от этого?

Обычно все операторы Switch-case используют break для выхода из него.Но если вместо «break» используется «return», это даст более быстрый код или меньший код, или, может быть, это будет чем-то другим?

switch (adv_mode)
{
    case BLE_ADV_MODE_DIRECTED_HIGH_DUTY:
        if (   (p_advertising->adv_modes_config.ble_adv_directed_high_duty_enabled)
            && (!p_advertising->adv_modes_config.ble_adv_extended_enabled)
            && (peer_addr_is_valid))
        {
            return BLE_ADV_MODE_DIRECTED_HIGH_DUTY;
        }
        // Fallthrough.

    case BLE_ADV_MODE_DIRECTED:
        if ((p_advertising->adv_modes_config.ble_adv_directed_enabled) && peer_addr_is_valid)
        {
            return BLE_ADV_MODE_DIRECTED;
        }
        // Fallthrough.

    case BLE_ADV_MODE_FAST:
        if (p_advertising->adv_modes_config.ble_adv_fast_enabled)
        {
            return BLE_ADV_MODE_FAST;
        }
        // Fallthrough.

    case BLE_ADV_MODE_SLOW:
        if (p_advertising->adv_modes_config.ble_adv_slow_enabled)
        {
            return BLE_ADV_MODE_SLOW;
        }
        // Fallthrough.

    default:
        return BLE_ADV_MODE_IDLE;
}

Я ожидаю, что бит 'return' и 'перерыв »даст те же результаты.Так что это просто предпочтение, которое используется программистом.

Ответы [ 2 ]

3 голосов
/ 09 июня 2019

return выходит из функции, в которой находится switch, и возвращается к своему абоненту.

break оставляет только switch и следующий оператор после того, как он будет выполнен.

В показанном случае функция возвращает какой-то режим. Если использовалось break, переменная для этого результата должна была быть установлена ​​и возвращена в конце функции. Иногда разработчик находит это слишком много, чтобы написать.

0 голосов
/ 10 июня 2019

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

Однако следует отметить, что это просто очень уродливый способ написания цепочки if. switch Fallthrough - невероятно плохая и опасная практика, которую нельзя использовать. Этот код должен быть переписан так, чтобы он был более надежным и читаемым:

if(adv_mode == BLE_ADV_MODE_DIRECTED_HIGH_DUTY && this && that)
{
  result = BLE_ADV_MODE_DIRECTED_HIGH_DUTY;
}
else if(...)
{
  result = BLE_ADV_MODE_DIRECTED;
}

Или, если константы являются смежными перечислениями от 0 до n , просто замените все это на:

return check(p_advertising)[adv_mode];

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

...