С точки зрения int (или короткого или длинного или любого другого), просто используйте x <= y
, и компилятор должен его оптимизировать. Например, на x86-64:
cmpq %rax, %rcx
jg false
#This is code to execute if (x <= y).
# Code
# .......
false:
#This is code to execute once the
# if statement is done or the condition
# resulted in a falsy value.
Если у вас есть, если-нибудь заявление, есть две команды скачка: первый, если условие дает falsy значение, а второй находится в конце кода блок, когда условие дает истинное значение (поэтому он может пропустить код, используемый для блока else).
Обратите внимание, что я использовал инструкцию jg (jump if more than). У x86 и x86-64 оба имеют инструкцию jnle (jump if not less or or), но она делает то же самое (в конце концов, если x не меньше или равно y, тогда логически x должно быть больше чем у), но с точки зрения работы в АСМ имеет смысл инвертировать условие. Если бы условие не было инвертировано, вы бы перескочили вперед, чтобы выполнить код для оператора if, и отскочили назад, чтобы возобновить основной поток программы. Почему в двух прыжках, что вы можете сделать с одним?
BTW, я не являюсь гуру ASM. Однако, если вы немного поработаете с ним, это может помочь вам избежать вопросов, подобных этим, потому что компилятор должен оптимизировать ваше состояние (x <= y)
до !(x > y)
в любом случае, как я показал. Нет необходимости пытаться повторить угадывание своего компилятора. Сосредоточьтесь на обычной оптимизации, которую вы можете сделать, чтобы помочь компилятору оптимизировать ваш код, например, устранение условий, которые не нужно выполнять в первую очередь, а не тот материал, который он уже знает, как это сделать.
Посмотрите на сборку из оптимизированной сборки. – Mat
Если '<=' перегружен, он почти всегда реализуется как '! (X> y)'. – Rapptz
Хорошо, тогда почему есть 'jle' и' jng'? Или это одна и та же инструкция? –