为什么将指针转换为 bool 时会出现性能警告?

新手上路,请多包涵

这个问题扩展了 为什么使用!!将 int 转换为 bool 时? .

当我做类似的事情时,我认为我很酷:

 bool hasParent() {
    return this->parentNode;
}

其中 this->parentNodeNULL 当没有父节点时。

但我得到:

警告 C4800:“节点 *”:强制值为布尔值“真”或“假”(性能警告)

即使使用 (bool) 强制转换,警告仍然不会消失。

有什么关系,哟?为什么这是性能警告?我认为写这样的东西效率会降低:

 bool hasParent() {
    if (this->parentNode)
        return true;
    else
        return false;
}

但是第二个版本没有产生任何警告,编译器似乎更开心了。哪个更快?

原文由 bobobobo 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 651
2 个回答

Microsoft Connect 上对此进行了讨论( 在 C++ 中转换为 bool 的性能影响是什么? )。给微软的例子是:

 $ cat -n t.cpp && cl -c -W3 -O2 -nologo -Fa t.cpp
1 bool f1 (int i)
2 {
3 return i & 2;
4 }
5
6 bool f2 (int i)
7 {
8 const bool b = i & 2;
9 return b;
10 }
11
12 bool f3 (int i)
13 {
14 const bool b = 0 != (i & 2);
15 return b;
16 }
t.cpp
t.cpp(3) : warning C4800: 'int' : forcing value to bool 'true' or 'false' (performance warning)
t.cpp(8) : warning C4800: 'int' : forcing value to bool 'true' or 'false' (performance warning)

微软的回应(来自负责警告的开发人员)是:

这个警告非常有用,昨天在我的代码中发现了一个错误。我认为马丁正在断章取意地使用“性能警告”。

这与生成的代码无关,而与程序员是否已发出将值从 int 更改为 bool 的意图有关。这样做是有代价的,用户可以选择一致地使用“int”而不是“bool”(或者反之亦然)以避免“boolifying”代码生成。在下面的第三种情况下,警告被抑制了,因为他清楚地表明了他接受 int->bool 转换的意图。

这是一个古老的警告,可能已经超过了它的目的,但它的行为与这里的设计一样

所以基本上 MS 开发人员似乎在说,如果你想将 int “投射”到 bool 你应该更正确地使用“ return this->parentNode != 0 ”而不是隐式或显式强制转换。

就个人而言,我很想知道更多关于警告发现什么样的错误。我认为这个警告不会有很大的价值。

原文由 Michael Burr 发布,翻译遵循 CC BY-SA 3.0 许可协议

投射到 bool 不会使警告消失的事实 是设计 使然:

将表达式转换为 bool 类型不会禁用警告,这是设计使然。

我会推荐 MSDN description of warning C4800 推荐的方法:

 return this->parentNode != NULL;

this makes it clear that you are returning true if parentNode is not a null pointer and false if parentNode is a null pointer.

原文由 James McNellis 发布,翻译遵循 CC BY-SA 2.5 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题