C++中的双感叹号(!!)会花费更多的CPU时间吗

Does double exclamation (!!) in C++ cost more CPU time?

本文关键字:CPU 时间 感叹 C++      更新时间:2023-10-16

我知道进行布尔转换是个技巧。我的问题主要是关于以这种方式写作时的资源成本。编译器会忽略"!!"并直接进行隐式布尔转换吗?

如果您有任何疑问,可以检查生成的程序集;注意,在程序集级别,无论如何都不存在布尔类型。所以,是的,它可能已经全部优化了。

根据经验,混合类型的代码(因此需要类型转换)运行速度会较慢,尽管这被另一条经验规则所掩盖,即编写清晰的代码

这取决于情况。

如果只关注可转换为bool并且可以是!运算符的操作数的基本类型,则这取决于编译器。根据目标系统的不同,编译器可能会发出一系列指令,以提供所需的效果,但不是以您设想的方式。此外,给定的编译器可能会以不同的方式处理问题,使用不同的优化设置(例如,编译用于调试与发布)。

唯一可以确定的方法是检查编译器发出的代码。在实践中,这不太可能产生多大影响。正如其他人所评论的那样,与其担心过早优化技术的优点,不如担心代码的清晰性和正确性。如果你有真正的需求(例如,操作在探查器识别的热点中),你将有数据来了解需求是什么,并确定采取措施的现实选择。实际上,我怀疑现实世界中有很多情况会有任何不同。

在C++中,对于用户定义的类型,所有的赌注都是不可能的。有很多可能性,比如具有返回类类型的operator!()的类,具有operator!()但没有operator bool()的类。这个列表还在继续,有很多排列。在某些情况下,编译器在进行这样的转换时会不正确(例如,!!x将被期望等效于x.operator!().operator!(),但实际上并没有要求(除了编码指南之外)该序列提供与x.operator bool()相同的净效果)。实际上,我不希望有太多的编译器试图在这种情况下发现机会——分析将是不平凡的,可能不会带来太多实际好处(优化单个指令很少能在编译器优化中获得好处)。同样,程序员最好专注于让代码变得清晰和正确,而不是担心编译器如何优化这样的单个表达式。例如,如果打算调用operator bool(),那么最好提供运算符AND编写一个使用它的表达式(例如bool(x)),而不是希望编译器将类似!!x的破解转换为x.operator bool()的调用。