Подходя к вашему вопросу двумя различными способами:
Если вы конкретно говорите о C ++ или каком-либо языке программирования, который будет производить ассемблерный код по этому вопросу, мы привязаны к тому, какой код компилятор сгенерирует в ASM.Мы также связаны с представлением истинного и ложного в c ++.Целое число должно храниться в 32 битах, и я мог бы просто использовать байт для хранения логического выражения.Фрагменты Asm для условных операторов:
Для целого числа:
mov eax,dword ptr[esp] ;Store integer
cmp eax,0 ;Compare to 0
je false ;If int is 0, its false
;Do what has to be done when true
false:
;Do what has to be done when false
Для значения bool:
mov al,1 ;Anything that is not 0 is true
test al,1 ;See if first bit is fliped
jz false ;Not fliped, so it's false
;Do what has to be done when true
false:
;Do what has to be done when false
Поэтому сравнение скорости зависит от компиляции.В случае выше, bool будет немного быстрым, так как cmp
будет означать вычитание для установки флагов.Это также противоречит тому, что сгенерировал ваш компилятор.
Другой, гораздо более простой подход заключается в том, чтобы взглянуть на логику выражения самостоятельно и постараться не беспокоиться о том, как компилятор переведет ваш код, иЯ думаю, что это гораздо более здоровый образ мышления.Я все еще верю, в конечном счете, что код, сгенерированный компилятором, на самом деле пытается дать правдивое решение.Я имею в виду, что, может быть, если вы увеличите количество тестов в операторе if и добавите логическое значение с одной стороны и целое число с другой, компилятор сделает это так, что сгенерированный код будет выполняться быстрее с логическими выражениями на машинном уровне.
Я считаю, что это концептуальный вопрос, поэтому я дам концептуальный ответ.Это обсуждение напоминает мне о дискуссиях, которые я обычно имею о том, означает ли эффективность кода уменьшение количества строк кода в сборке.Кажется, что эта концепция общепринята как истинная.Учитывая, что отслеживание того, насколько быстро ALU будет обрабатывать каждый оператор, нежизнеспособно, вторым вариантом будет сосредоточиться на переходах и сравнении в сборке.В этом случае различие между логическими выражениями или целыми числами в представленном вами коде становится довольно представительным.Результат выражения в C ++ вернет значение, которому затем будет дано представление.В сборке, с другой стороны, переходы и сравнения будут основываться на числовых значениях, независимо от того, какой тип выражения вычислялся в вашем операторе C ++ if.По этим вопросам важно помнить, что чисто логические утверждения, подобные этим, приводят к огромным вычислительным затратам, даже если один бит может быть способен на то же самое.