Оптимизация C++: какой код быстрее?

Компьютеры C++ Программирование

// Вариант №1
if (a & 0x0800) {
r = x1+x2;
}
else r = x1-x2;

// Вариант №2
int x[2] = [x1+x2, x1-x2];
r = x[ a & 0x0800 ];

// Вариант №3
r = x1 - x2 + 2*x2*(a & 0x0800);

// Вариант №4
class baseclass {
public:
virtual int func(x1, x2);
}

class plus : public baseclass {
public:
virtual int func(x1, x2) { return x1+x2; };
}

class minus : public baseclass {
public:
virtual int func(x1, x2) { return x1-x2; };
}

baseclass* x[2];
x[0] = new minus();
x[1] = new plus();

r = x[ a & 0x0800 ] -> func(x1, x2);

/*
Это пример. На деле операции будут сложнее и с более сложными условиями.

Меня интересует, какой вариант самый лучший с точки зрения быстродействия. "Подготовительный этап" варианта №4 в оценке не учитывать, т.к. он будет выполнен всего 1 раз при запуске программы.
*/

Примечание:
я допустил ошибку: везде нужно что-то типа (bool)a & 0x0800
или сравнение a & 0x0800 = 0x0800.
результат выражения только 0 или 1
Ответы:
Ошибки в нескольких вариантах:
a & 0x0800 не может равняться единице!
Самый быстрый:
r =(a & 0x0800)?(x1+x2):(x1-x2);
Тут наибольшая вероятность оптимизации.


15 лет назад

RPI.su - самая большая русскоязычная база вопросов и ответов. Наш проект был реализован как продолжение популярного сервиса otvety.google.ru, который был закрыт и удален 30 апреля 2015 года. Мы решили воскресить полезный сервис Ответы Гугл, чтобы любой человек смог публично узнать ответ на свой вопрос у интернет сообщества.

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

Чтобы связаться с нами по любому вопросу О САЙТЕ (реклама, сотрудничество, отзыв о сервисе), пишите на почту [email protected]. Только все общие вопросы размещайте на сайте, на них ответ по почте не предоставляется.