Ваш вывод о производительности основан на популярной ложной предпосылке.
По какой-то причине вы настаиваете на переводе языковых операций в их «очевидные» машинные аналоги и делаете выводы о производительности на основе этого перевода. В этом конкретном случае вы пришли к выводу, что побитовая и &
операция языка C ++ должна быть реализована с помощью машинной операции побитовой и, тогда как операция по модулю %
должна каким-то образом включать машинное деление em >, что якобы медленнее. Такой подход имеет очень ограниченное применение, если вообще используется.
Во-первых, я не могу представить себе компилятор C ++ из реальной жизни, который интерпретировал бы языковые операции таким «буквальным» образом, то есть отображая их в «эквивалентные» машинные операции. В основном потому, что чаще, чем можно было бы подумать, эквивалентных машинных операций просто не существует.
Когда дело доходит до таких базовых операций с непосредственной константой в качестве операнда, любой уважающий себя компилятор всегда сразу «поймет», что и num & 1
, и num % 2
для интегрального num
делают одно и то же, что заставит компилятор сгенерировать абсолютно идентичный код для оба выражения. Естественно, производительность будет точно такой же.
Кстати, это не называется «оптимизацией». Оптимизация, по определению, - это когда компилятор решает отклониться от стандартного поведения абстрактной машины C ++, чтобы сгенерировать более эффективный код (сохраняя наблюдаемое поведение программы). В этом случае нет отклонений, а это означает, что нет оптимизации.
Более того, вполне возможно, что на данной машине наиболее оптимальным способом реализации обоих является не побитовое и и не деление, а какая-то другая специализированная машинно-зависимая инструкция. Вдобавок ко всему, вполне возможно, что в какой-либо инструкции вообще не будет необходимости, поскольку четность / нечетность определенного значения может быть выставлена «бесплатно» с помощью флагов состояния процессора или чего-то подобного. тот.
Другими словами, аргумент эффективности неверен.
Во-вторых, возвращаясь к исходному вопросу, более предпочтительным способом определения четности / нечетности значения, безусловно, является подход num % 2
, поскольку он реализует требуемую проверку буквально («по определению») и четко выражает Дело в том, что проверка чисто математическая. Т.е. он дает понять, что мы заботимся о свойстве числа, а не о свойстве его представления (как это было бы в случае варианта num & 1
).
Вариант num & 1
следует зарезервировать для ситуаций, когда вам нужен доступ к битам представления значения числа. Использование этого кода для проверки четности / нечетности - весьма сомнительная практика.
person
AnT
schedule
22.12.2009