Тернарный оператор?: Против если ... еще - PullRequest
65 голосов
/ 25 августа 2010

В C ++ оператор?: Быстрее, чем оператор if () ... else?Есть ли различия между ними в скомпилированном коде?

Ответы [ 14 ]

93 голосов
/ 25 августа 2010

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

const int x = (a<b) ? b : a;

Вы не можете сделать то же самое с if-else.

82 голосов
/ 25 августа 2010

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

40 голосов
/ 25 августа 2010

Я видел, как GCC превращал условный оператор в инструкции cmov (условное перемещение), в то время как операторы if превращались в ветви, что означало, что в нашем случае код был быстрее при использовании условного оператора.Но это было пару лет назад, и, скорее всего, сегодня оба будут компилироваться в один и тот же код.

Нет гарантии, что они будут компилироваться в один и тот же код.Если вам нужна производительность, то, как всегда, мера .И когда вы измерили и обнаружили, что: 1. ваш код слишком медленный, и 2. именно этот кусок кода является виновником, тогда изучите код сборки, сгенерированный компилятором, и проверьте сами, что происходит.

Не доверяйте золотым правилам, таким как «компилятор всегда будет генерировать более эффективный код, если я использую условный оператор».

14 голосов
/ 25 августа 2010

Они одинаковы, однако троичный оператор может использоваться в местах, где трудно использовать if / else:

printf("Total: %d item%s", cnt, cnt != 1 ? "s" : "");

Выполнение этого оператора с помощью if / else приведет к созданию совершенно другого скомпилированного кода.


Обновление через 8 лет ...

На самом деле, я думаю, что это было бы лучше:

printf(cnt == 1 ? "Total: %d item" : "Total: %d items", cnt);

(на самом деле, я уверен, что вы можете заменить "% d" в первой строке на "один")

2 голосов
/ 23 декабря 2015

Независимо от скомпилированного кода, они семантически разные вещи.<cond>?<true expr>:<false expr> - это выражение, а if..else.. - это выражение.

Хотя синтаксис условного выражения кажется неуклюжим, это хорошая вещь.Вы вынуждены предоставить <false expr>, и два выражения проверяются на тип.

Эквивалент if..else.. в функциональном языке на основе выражений, таком как Lisp, Haskell - ? : в C ++ вместо if..else.. заявление.

2 голосов
/ 15 июля 2014

Просто чтобы быть немного левшой ...

x ? y : x = value

назначит значение на y , если x не равно 0(ложь). * * +1010

0 голосов
/ 20 ноября 2015

Вы не обязаны помещать все это в одну строку: -

x = y==1 ?
    2
    :// else
    3;

Это намного понятнее, чем if / else, потому что вы сразу видите, что обе ветви приводят к тому, что x назначается.

0 голосов
/ 05 июня 2015

Я думаю, что бывают ситуации, когда встроенный 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.Несмотря на то, что весьма вероятно, что скорость оценки состояния в обоих сценариях довольно одинакова, изменение объема вынуждает вас принимать во внимание другие факторы, которые встроенный метод позволяет вам избежать.

0 голосов
/ 07 февраля 2012

Тернарный оператор всегда возвращает значение.Таким образом, в ситуации, когда вы хотите получить какое-то выходное значение из результата и есть только 2 условия, всегда лучше использовать троичный оператор.Используйте if-else, если какое-либо из вышеперечисленных условий не соответствует действительности.

0 голосов
/ 19 января 2012

Во время изменения некоторого кода (который я не помню несколько лет назад) я увидел разницу в одной строке между машинным кодом:? и если-еще. Don't remember much but it is clear that implementation of both is different.

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

...