以这种方式将整数转换为布尔值的原因是什么?
bool booleanValue = !!integerValue;
Run Code Online (Sandbox Code Playgroud)
而不仅仅是
bool booleanValue = integerValue;
Run Code Online (Sandbox Code Playgroud)
我所知道的是,在VC++ 7中,后者将导致C4800警告而前者不会.这两者之间还有其他区别吗?
[这个问题有关,但并不等同于这一个 ]
我的编译器警告隐式转换或将某些类型转换为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<bool>(t); // performance warning
b = t ? true : false; // ok, no warning
b = t != 0; // ok
b = !!t; // ok
Run Code Online (Sandbox Code Playgroud)
这是使用Visual C++ 2008但我怀疑其他编译器可能有类似的警告.
所以我的问题是:铸造/转换的性能影响是什么bool?在某些情况下(例如,对于某些目标体系结构或处理器),显式转换是否具有更好的性能?隐式转换是否会以某种方式混淆优化器?
微软对其警告的解释并不是特别有用.他们暗示有充分的理由,但他们没有解释.
在C++之前的11天里,编写更好的做法是:
if (ptr == NULL)
Run Code Online (Sandbox Code Playgroud)
而不是:
if (!ptr)
Run Code Online (Sandbox Code Playgroud)
这有两个原因.它效率更高,因为它不需要强制转换为bool.并且无法保证宏NULL确实会评估为布尔值false.这在C++ 11中仍然如此吗?写作是否更可取
if (ptr == nullptr)
Run Code Online (Sandbox Code Playgroud)
而不是
if (!ptr)
Run Code Online (Sandbox Code Playgroud)
或者现在是第二次罚款?