Должен ли я удалить ненужные `else` в` else if`? - PullRequest
1 голос
/ 25 января 2011

Сравните два:

if (strstr(a, "earth"))     // A1
    return x;
if (strstr(a, "ear"))       // A2
    return y;

и

if (strstr(a, "earth"))     // B1
    return x;
else if (strstr(a, "ear"))  // B2
    return y;

Лично я чувствую, что else избыточен и не позволяет ЦП прогнозировать ветвления.

В первом случае при выполнении A1 можно предварительно декодировать A2. А во втором он не будет интерпретировать B2, пока B1 не будет оценен как false.

Я нашел много (может быть, большинство?) Источников, использующих последнюю форму. Впрочем, последняя форма выглядит лучше для понимания, потому что не так очевидно, что она будет вызывать return y, только если a =~ /ear(?!th)/ без предложения else.

Ответы [ 5 ]

6 голосов
/ 25 января 2011

Ваш компилятор, вероятно, знает, что оба этих примера означают одно и то же. Предсказание ветвей процессора не входит в это.

Обычно я выбираю первый вариант симметрии.

3 голосов
/ 25 января 2011

( Следующее отвечает на исходную версию вопроса. )

Понимаете ли вы, что два фрагмента кода НЕ семантически эквивалентны ???

Подумайте, чтопроисходит, если a является «землей».

  • Первый фрагмент вызывает foo(), а затем bar().
  • Второй фрагмент вызывает foo() и пропускает bar() call.

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

Лично я считаю, что еще избыточно ...

К сожалению, ваше чувство неверно.

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


FOLLOWUP

Фрагменты в обновленной версии вопроса теперь семантически идентичны, а else является избыточным.Однако:

  • любой полуприличный оптимизирующий компилятор сгенерирует идентичный код для двух фрагментов, а
  • это вопрос мнения (т.е. субъективный), какой из фрагментов легче понять.
2 голосов
/ 25 января 2011

Используйте else if до , четко заявите о своих намерениях .Код предназначен для чтения людей .

Позвольте компилятору оптимизировать это, и не беспокойтесь об оптимизации, пока ваш код не будет 1) работает 2) кристально чистый 3) профилированный (делатьэто в таком порядке).Выполняя шаг 3, вы заметите, что узкие места находятся не там, где вы предполагали.

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

Посмотрите на вывод компиляторов на основе LLVM, чтобы понять, что я имею в виду: иногда вы даже не можете даже дистанционно понять, что он делает.

0 голосов
/ 25 января 2011

Почему бы просто не написать

char* str;

strstr(a, "ear")

if (str != NULL)
{
  foo();

  if(strstr(str, "earth") != NULL)
  {
    bar();
  }
}
0 голосов
/ 25 января 2011

обычно лучше использовать второй способ, если вы хотите точно проверить условие для a, для точного решения, чтобы уменьшить параметры для var или const "a". если вы напишите два отдельных if, вы можете получить 2 разных решения.

например, в вашей ситуации с точными условиями, которые у вас есть, скажем, а = -2

A: if (a < 0)
    return x; // if -2 is less than 0 will return x and it stops.
else if (a < 100)
    return y; // 

B: if (a < 0)
    return x; // -2 is less than 0 so it will return x and passes to the next if statement;
 if (a < 100)
    return y; // -2 is also less than 100 and it will return y too
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...