Каков хороший способ получить 0 или значение, зависящее от логического значения?

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

glOrtho(0.0f, _width, flip ? 0.0f : _height, flip ? _height : 0.0f, -1.0f, 1.0f);

Мне было интересно, будет ли более оптимизированный способ сделать это, например:

glOrtho(0.0f, _width, !flip * _height, flip * _height, -1.0f, 1.0f);

Или побитовая операция будет работать?

Спасибо за любой отзыв!


person 3nixios    schedule 24.05.2011    source источник
comment
Действительно ли оптимизация вызывает здесь беспокойство, учитывая, что переворот экрана происходит относительно редко?   -  person Greg    schedule 24.05.2011
comment
я бы предположил, что умный компилятор все равно оптимизирует это.   -  person clamp    schedule 24.05.2011
comment
Поскольку эта функция вызывается очень редко (даже если она вызывается один раз за кадр, она просто перевешивается многими вещами), это довольно необычное место для оптимизации. Я не знаю, хорошо ли обменять небольшой скачок на умножение с плавающей запятой. Но вы также можете переинтерпретировать _height как int и & с flip и -flip соответственно.   -  person Christian Rau    schedule 24.05.2011
comment
Как я уже сказал, это был скорее гипотетический вопрос, я думаю, мне следовало задать вопрос по-другому, но в любом случае я просто проверю, что делает компилятор.   -  person 3nixios    schedule 24.05.2011


Ответы (2)


Вы уверены, что это узкое место в вашей программе?? Не оптимизируйте и не запутывайте свой код на ранней стадии только ради небольшой выгоды.

person Vincent Mimoun-Prat    schedule 24.05.2011
comment
+1. Абсолютно. Во всяком случае, вполне возможно, что компилятор найдет для этого лучшую оптимизацию, чем умножение. Пусть делает свою работу. - person Oliver Charlesworth; 24.05.2011
comment
Я понимаю необходимость ответственности за код, я думаю, это был скорее гипотетический вопрос. Я думаю, я проверю оптимизацию компилятора позже просто из интереса. Спасибо за быстрый ответ :). - person 3nixios; 24.05.2011

В общем случае boolValue ? floatValue : 0.0f равно boolValue * floatValue

person MSalters    schedule 24.05.2011
comment
Да, но один быстрее другого? - person Oliver Charlesworth; 24.05.2011
comment
@Oli: Возможно, учитывая, что тройной оператор по сути является условным оператором, но этого недостаточно, чтобы меня это беспокоило. - person Greg; 24.05.2011
comment
@Oli: В общем, я считаю, что первый должен быть быстрее, поскольку он по сути testb, а второй включает математику с плавающей запятой. - person ; 24.05.2011
comment
@Vlad Lazarenko: Это очень зависит от реализации (не все процессоры имеют testb), но математика с плавающей запятой обычно дешевле, чем загрузка памяти. - person MSalters; 26.05.2011
comment
Я думаю, все зависит, верно? Если этот материал уже находится в регистре, проверка логического значения и возврат числа с плавающей запятой должны быть быстрее, чем математика FP, даже с материалом MMX. Я говорю в основном о ядрах Intel. Это нужно проверить, чтобы знать наверняка. Но я не думаю, что это хуже, если это не узкое место, в чем я сомневаюсь. - person ; 26.05.2011