[这个问题有关,但并不等同于这一个 ]
我的编译器警告隐式转换或将某些类型转换为bool,而显式转换不会产生警告:
long t = 0; bool b = false; b = t; // performance warning: forcing long to bool b = (bool)t; // performance warning b = bool(t); // performance warning b = static_cast(t); // performance warning b = t ? true : false; // ok, no warning b = t != 0; // ok b = !!t; // ok
这是使用Visual C++ 2008但我怀疑其他编译器可能有类似的警告.
所以我的问题是:铸造/转换的性能影响是什么bool
?在某些情况下(例如,对于某些目标体系结构或处理器),显式转换是否具有更好的性能?隐式转换是否会以某种方式混淆优化器?
微软对其警告的解释并不是特别有用.他们暗示有充分的理由,但他们没有解释.
我对这种行为感到困惑,直到找到这个链接:
http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=99633
显然,来自微软开发人员"拥有"此警告:
这个警告非常有用,昨天我的代码中发现了一个错误.我认为马丁正在脱离背景"性能警告".
它不是关于生成的代码,而是关于程序员是否发出了将值从int更改为bool的意图.对此有一个惩罚,并且用户可以选择一致地使用"int"而不是"bool"(或者更可能反之亦然)以避免"boolifying"codegen.[...]
这是一个旧的警告,可能已经超出了它的目的,但它的行为与此处的设计相同.
所以在我看来,警告更多的是关于风格和避免一些错误而不是其他任何事情.
希望这能回答你的问题......
:-P
整体表现完全相同.它涉及x86上的一些指令,在其他一些架构上可能有3个指令.
在x86/VC++上,他们都这样做
cmp DWORD PTR [whatever], 0 setne al
GCC生成相同的东西,但没有警告(在任何警告级别).
性能警告实际上确实有点意义.我也有它,我的好奇心导致我与反汇编者一起调查.它试图告诉你编译器必须生成一些代码来强制将值强制为0或1.因为你坚持使用bool,旧学校C的0或其他任何东西都不适用.
如果你真的想要,你可以避免这种微小的性能损失.最好的方法是完全避免演员阵容并从一开始就使用bool.如果你必须有一个int,你可以使用if(int)而不是if(bool).生成的代码将简单地检查int是否为0.如果不是0,则不会生成确保值为1的额外代码.