В С++ оператор?: быстрее, чем if()... else. Существуют ли различия между ними в скомпилированном коде?
Тернарный оператор?: Vs if... else
Ответ 1
Зависит от вашего компилятора, но на любом современном компиляторе, как правило, нет разницы. Это то, о чем вы не должны беспокоиться. Сосредоточьтесь на ремонтопригодности вашего кода.
Ответ 2
Это не быстрее. Существует одна разница, когда вы можете инициализировать постоянную переменную в зависимости от некоторого выражения:
const int x = (a<b) ? b : a;
Вы не можете сделать то же самое с if-else
.
Ответ 3
Я видел, что GCC превращает условный оператор в инструкции cmov
(условное перемещение), а при преобразовании операторов if
в ветки, что означало в нашем случае, код был быстрее при использовании условного оператора. Но это было пару лет назад, и, скорее всего, сегодня оба будут компилироваться по одному и тому же коду.
Там нет гарантии, что они будут компилироваться по одному и тому же коду. Если вам нужна производительность, то, как всегда, измерьте. И когда вы измерили и узнали, что 1. ваш код слишком медленный, и 2. именно этот кусок кода является виновником, затем изучите код сборки, сгенерированный компилятором, и проверьте сами, что происходит.
Не доверяйте золотым правилам вроде "компилятор всегда будет генерировать более эффективный код, если я использую условный оператор".
Ответ 4
Они одинаковы, однако тернарный оператор может использоваться в тех местах, где трудно использовать if if else:
printf("Total: %d item%s", cnt, cnt != 1 ? "s" : "");
Выполнение этой инструкции с if/else приведет к генерации очень другого скомпилированного кода.
Ответ 5
Просто чтобы быть немного левым...
x ? y : x = value
присваивает значение y, если x не равно 0 (false).
Ответ 6
Независимо от скомпилированного кода, они семантически разные вещи. <cond>?<true expr>:<false expr>
- выражение, а if..else..
- утверждение.
Хотя синтаксис условного выражения кажется неудобным, это хорошо. Вы вынуждены предоставить <false expr>
, и два выражения проверяются по типу.
Эквивалентно if..else..
в функциональном языке на основе выражения, таком как Lisp, Haskell ? :
в С++ вместо оператора if..else..
.
Ответ 7
Теперь я не могу с этим поделать, я могу помочь с второстепенным вопросом под ним, хочу ли я его использовать? Если вы просто хотите узнать о скорости, просто игнорируйте мой комментарий.
Все, что я могу сказать, это быть очень умным, когда использовать троицу?: оператор. Это может быть благословением, а также бичем для удобочитаемости.
Спросите себя, находите ли вы это проще для чтения, прежде чем использовать его
int x = x == 1 ? x = 1 : x = 1;
if (x == 1)
{
x = 1
}
else
{
x = 2
}
if (x == 1)
x = 1
else
x = 1
Да Это выглядит глупо, чтобы сделать код на 100% фиктивным. Но этот небольшой трюк помог мне проанализировать мою читаемость кода. Это читаемость оператора, на который вы смотрите в этом примере, а не на контент.
Он СМОТРЕТЬ чистым, но также среднее сиденье для унитаза и дверная ручка
По моему опыту, который ограничен, я видел очень мало людей, которые действительно могли быстро выдавать информацию, требуемую от тройного оператора, избегать, если только 100% не уверены в этом. Это боль, чтобы исправить, когда она прослушивается, я думаю,
Ответ 8
Я бы ожидал, что на большинстве компиляторов и целевых платформ будут случаи, когда "if" быстрее, а случаи где?: быстрее. Будут также случаи, когда одна форма более или менее компактна, чем другая. Какие случаи относятся к одной форме или другой, будут различаться между компиляторами и платформами. Если вы пишете критически важный код на встроенном микропроцессе, посмотрите, что генерирует компилятор в каждом случае, и посмотрите, что лучше. На "мейнстримовом" ПК из-за проблем с кешированием единственный способ увидеть, что лучше, - это сопоставить обе формы в чем-то, напоминающем реальное приложение.
Ответ 9
Во время реверсирования некоторого кода (который я не помню, несколько лет назад) я видел разницу в одной строке между машинным кодом:? и if-else.
Don't remember much but it is clear that implementation of both is different.
Но я советую вам не выбирать один из них b'coz своей эффективности, выбирать в соответствии с читабельностью кода или вашего удобства. Счастливое кодирование
Ответ 10
Тернарный оператор всегда возвращает значение. Поэтому в ситуации, когда вам нужно какое-то выходное значение из результата, и только два условия всегда лучше использовать тернарный оператор. Используйте if-else, если какое-либо из вышеупомянутых условий не соответствует действительности.
Ответ 11
Я думаю, что есть ситуации, когда inline if может получить "более быстрый" код из-за области, в которой он работает. Создание и уничтожение объектов может быть дорогостоящим, поэтому рассмотрим следующий сценарий:
class A{
public:
A() : value(0) {
cout << "Default ctor" << endl;
}
A(int myInt) : value(myInt)
{
cout << "Overloaded ctor" << endl;
}
A& operator=(const A& other){
cout << "= operator" << endl;
value = other.value;
}
~A(){
cout << "destroyed" << std::endl;
}
int value;
};
int main()
{
{
A a;
if(true){
a = A(5);
}else{
a = A(10);
}
}
cout << "Next test" << endl;
{
A b = true? A(5) : A(10);
}
return 0;
}
С помощью этого кода вывод будет:
Default ctor
Overloaded ctor
= operator
destroyed
destroyed
Next test
Overloaded ctor
destroyed
Таким образом, вставив if, мы сохраним кучу операций, необходимых для поддержания a
живого в той же области, что и b
. Хотя очень вероятно, что скорость оценки состояния довольно одинакова в обоих сценариях, изменение сферы действия заставляет вас учитывать другие факторы, что встроенный, если позволяет избежать.
Ответ 12
Вы не должны ставить все на одной строке: -
x = y==1 ?
2
:// else
3;
Это намного яснее, чем if/else, потому что вы можете сразу увидеть, что обе ветки приводят к назначению x.
Ответ 13
В C Тернарный оператор "?:" доступен для построения условных выражений вида
exp1 ? exp2:exp3
где exp1, exp2 и exp3 - выражения
для примера
a=20;
b=25;
x=(a>b)?a:b;
in the above example x value will be assigned to b;
Это можно записать с помощью инструкции if..else, как показано ниже
if (a>b)
x=a;
else
x=b;
** Следовательно, нет никакой разницы между этими двумя. Это для программиста, чтобы писать легко, но для компилятора оба они одинаковы. *
Ответ 14
Нет, они преобразуются в один и тот же исполняемый код.