Есть ли разница между этими кодами - PullRequest
2 голосов
/ 27 мая 2011

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

Вот два способа сделать одно и то же

if(foo != true)
{
bar ++;
}

if(foo == true)
{
}
else
{
bar ++;
}

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

Мой вопрос, действительно ли второй вариант повлечет за собой какое-то наказание, потому что добавляет к проверке еще одну команду?

Да, это была опечатка.

Ответы [ 7 ]

10 голосов
/ 27 мая 2011

Ни то, ни другое.Помимо того, что второй содержит опечатку (= вместо ==), сравнение логических значений с константами просто излишне.Просто проверьте их значения напрямую:

if (! foo) …
// Instead of
if (foo != true) …

// or

if (foo) …
// Instead of
if (foo == true) …

Прежде всего, это исключает возможность создания ошибок при опечатках (как вы любезно показали).Но кроме этого это просто более логично.

(Обратите внимание, что это не более эффективно. Утверждения строго эквивалентны.)

5 голосов
/ 27 мая 2011

Они имеют одинаковый эффект, и тот же машинный код, вероятно, будет генерироваться любым приличным компилятором - проверка логического значения и выбор того, что нужно сделать, будут выполнены самым быстрым способом.«Добавление else» - это не то, как оно работает внутри - это просто выражение if-else, которое должно иметь определенный эффект, это зависит от компилятора, как добиться этого эффекта.Простое добавление ключевого слова не обязательно вызывает дополнительный выброс кода.

Если вам действительно важно, вы должны проверить выданный машинный код и посмотреть, что компилятор выдает в каждом случае.

3 голосов
/ 27 мая 2011

Полагаю, вы написали опечатку вместо ==. Эти блоки не эквивалентны: современные процессоры пытаются предварительно извлекать и предварительно выполнять инструкции по сборке во время выполнения программы, а когда выполняется условный переход, CPU предварительно запускает код, который он будет выполнять, если условие выполнено.

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

Редактировать: Пожалуйста, посмотрите на Прогноз ветвления в Википедии, и особенно в разделе Статическое предсказание. Если вы не уверены в том, какую оптимизацию выполнит компилятор на 100% и какой процессор будет выполнять ваш код, лучше всего предположить, что первый блок выполняется быстрее. В худшем случае вы не получаете никакой выгоды и никаких потерь. В лучшем случае вы создаете код, который легче читать и работает быстрее.

Counter-пример:

if (someCondition)
    AssertNotReached();
else
    DoRealWork();
2 голосов
/ 27 мая 2011

Оба не одинаковы, во втором коде всегда оператор if выполняется так, как он задан как foo = true.

1 голос
/ 27 мая 2011

Существует большая разница: первое значение bar основано на условии, второе устанавливает foo в значение true.

if(foo != true)
{
bar ++;
}

if(foo = true) //this sets foo to true and takes the true branch of the statement, any optmizing compiler will remove the else section
{
}
else
{
bar ++;
}

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

0 голосов
/ 27 мая 2011

Семантически это то же самое. Что происходит дальше, зависит от компилятора. Обычно , с оператором if компилятор будет предполагать, что ветка "if" выбрана более вероятно, и оптимизировать для этого. Если это произойдет, второй пример действительно будет иметь некоторое снижение производительности. Но это действительно зависит от многих вещей, которые мы не знаем из контекста вопроса.

0 голосов
/ 27 мая 2011

Это зависит от компилятора.В худшем случае он добавляет пару дополнительных инструкций прыжка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...