当前位置:  开发笔记 > 编程语言 > 正文

在C++中转换为bool的性能含义是什么?

如何解决《在C++中转换为bool的性能含义是什么?》经验,为你挑选了3个好方法。

[这个问题有关,但并不等同于这一个 ]

我的编译器警告隐式转换或将某些类型转换为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?在某些情况下(例如,对于某些目标体系结构或处理器),显式转换是否具有更好的性能?隐式转换是否会以某种方式混淆优化器?

微软对其警告的解释并不是特别有用.他们暗示有充分的理由,但他们没有解释.



1> paercebal..:

我对这种行为感到困惑,直到找到这个链接:

http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=99633

显然,来自微软开发人员"拥有"此警告:

这个警告非常有用,昨天我的代码中发现了一个错误.我认为马丁正在脱离背景"性能警告".

它不是关于生成的代码,而是关于程序员是否发出了将值从int更改为bool的意图.对此有一个惩罚,并且用户可以选择一致地使用"int"而不是"bool"(或者更可能反之亦然)以避免"boolifying"codegen.[...]

这是一个旧的警告,可能已经超出了它的目的,但它的行为与此处的设计相同.

所以在我看来,警告更多的是关于风格和避免一些错误而不是其他任何事情.

希望这能回答你的问题......

:-P






2> 小智..:

整体表现完全相同.它涉及x86上的一些指令,在其他一些架构上可能有3个指令.

在x86/VC++上,他们都这样做

cmp DWORD PTR [whatever], 0
setne al

GCC生成相同的东西,但没有警告(在任何警告级别).



3> Bill Forster..:

性能警告实际上确实有点意义.我也有它,我的好奇心导致我与反汇编者一起调查.它试图告诉你编译器必须生成一些代码来强制将值强制为0或1.因为你坚持使用bool,旧学校C的0或其他任何东西都不适用.

如果你真的想要,你可以避免这种微小的性能损失.最好的方法是完全避免演员阵容并从一开始就使用bool.如果你必须有一个int,你可以使用if(int)而不是if(bool).生成的代码将简单地检查int是否为0.如果不是0,则不会生成确保值为1的额外代码.

推荐阅读
小色米虫_524
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有