Dan*_*Tao 28 optimization boolean
这是一个纯粹迂腐的问题,以满足自己的好奇心.
我倾向于在问题中使用后一种选择(所以if (boolCheck) { ... }:),而同事总是写前者(if (boolCheck == true) { ... }).我总是有点嘲笑他,并且从他第一次开始编程时他总是把它解释为一种旧习惯.
但是我今天刚刚想到,实际写出整个== true部分可能实际上需要一个额外的处理步骤,因为任何带有==运算符的表达式都会被计算为布尔值.这是真的?
换句话说,据我所知,没有 == true行的选项可以松散地描述如下:
使用 == true行的选项更像是:
我对么?或者也许任何普通的编译器/解释器都会消除这种差异?或者我忽略了什么,而且根本没有什么区别?
显然,在实际观察到的性能方面没有区别.就像我说的,我只是好奇.
编辑:感谢所有实际发布编译结果的人,以说明两种方法之间的步骤是否不同.(看起来,大部分时间,它们都是,虽然只是轻微的.)
我只想重申,我并不是在问什么是"正确的"方法.我知道很多人喜欢一个人而不是另一个人.我也理解,从逻辑上讲,两者是相同的.如果CPU执行的实际操作对于两种方法完全相同,我只是很好奇; 事实证明,在很多时候(显然它取决于语言,编译器等),它们不是.
Luk*_*keH 16
我希望通过任何半合适的编译器来优化差异.
(我刚用C#检查过,两种语法的编译代码完全相同.)
i_a*_*orf 13
编译器应该生成相同的代码.然而,与真实相比可以说更好,因为它更明确.一般来说,我不做明确的比较,但你不应该取笑他这样做.
编辑:最简单的方法是尝试.MS编译器(cl.exe)在汇编中生成相同数量的步骤:
int _tmain(int argc, _TCHAR* argv[])
{
bool test_me = true;
if (test_me) {
004113C2 movzx eax,byte ptr [test_me]
004113C6 test eax,eax
004113C8 je wmain+41h (4113E1h)
printf("test_me was true!");
}
if (test_me == true) {
004113E1 movzx eax,byte ptr [test_me]
004113E5 cmp eax,1
004113E8 jne wmain+61h (411401h)
printf("still true!");
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
此时问题是做测试和cmp有相同的成本吗?我的猜测是肯定的,尽管专家可能会指出差异.
实际结果是你不应该担心这一点.你可能有更大的性能鱼炒.
Mic*_*urr 10
重复的问题(我应该使用`!IsGood`或`IsGood == false`?).这是我之前回答的指针:
如果有问题的变量确实被用作布尔值(即使它的类型不是布尔值),那么专门针对true或false进行测试的技术是不好的做法 - 特别是在C/C++中.针对true can(并且可能会)的测试会导致细微的错误.
有关详细信息,请参阅以下SO答案:
我应该使用`!IsGood`还是`IsGood == false`?
这是一个详细说明为什么"== true"在更明确的细节中经常是错误的原因,包括Stroustrup的解释:https: //qt-project.org/forums/viewthread/32642
根据我的经验,if (flag==true)这是不好的做法。
第一个论点是学术性的:
如果有 a bool flag,则它是true或false。
现在,表达
(flag==true)
Run Code Online (Sandbox Code Playgroud)
再说一次,是true或false——它并不更具表现力,只是多余——flag无法比现在变得“更真实”或“更虚假”。只有当布尔值不明显时,它才会“更清晰” flag- 但有一个标准方法可以修复适用于所有类型的问题:选择一个更好的名称。
如果将其延伸到超出合理范围,以下内容将“甚至更好”:
((flag==true)==true)
Run Code Online (Sandbox Code Playgroud)
第二个论点是务实且特定于平台的
C 和早期的 C++ 实现没有真正的“bool”类型,因此标志有不同的约定,最常见的是任何非零的内容都是 true。API 返回基于整数的 BOOL 类型但不强制返回值为 0 或 1 的情况并不罕见。
某些环境使用以下定义:
#define FALSE 0
#define TRUE (!FALSE)
Run Code Online (Sandbox Code Playgroud)
祝你好运if ((1==1) == TRUE)
此外,某些平台使用不同的值 - 例如,VARIANT_BOOLVB 互操作的 是 a short,并且VARIANT_TRUE是-1。
当使用这些定义混合库时,与 true 的显式比较很容易成为伪装成良好意图的错误。所以,不要。