是否在C双键感叹号(!)++花费更多的CPU时间? [关闭]

问题描述 投票:0回答:2

我知道这是一个把戏做布尔转换。写这样,当我的问题主要是关于资源成本。将编译器只是忽略了“!!”并直接做隐含布尔转换?

c++ compiler-optimization
2个回答
2
投票

如果您有任何疑问,您可以检查生成的汇编;在组件级别注意到不存在这样的东西作为一个布尔类型反正。所以,是的,它可能是所有优化掉了。

作为一个经验法则,其混合的类型因此迫使类型转换运行速度会变慢,尽管这是由拇指的另一个规则是写清楚码掩蔽码。


2
投票

这取决于。

如果限制只关注基本类型,可转换为bool,可以是!操作者的操作,那就要看编译器。根据目标系统上,编译器可能发出的指令序列,让所需的效果,但不是你想象的方式。此外,一个给定的编译器可以区别对待的事情,不同的优化设置(如编译调试与发布)。

可以肯定的唯一方法是检查由编译器发出的代码。在实践中,这是不可能作出太大的差别。正如其他人的评论,你会过得更好担心让你的代码清晰并正确工作,比约过早优化技术的优点。如果你有一个真正的需要(例如操作是由分析器识别的热点),比你有数据要了解需要是什么,并确定现实的选择做一些事情。实际上,我会怀疑有很多现实世界的情况下,会有什么区别。

在C ++中,与用户定义的类型,所有的赌注都关闭。有很多可能性,比如有一个返回的类类型,一个具有operator!()但不是一个operator!()类的operator bool()类。这样的例子不胜枚举,并有许多排列。有这样的情况,编译器会做这种转变不正确(如!!x预计将相当于x.operator!().operator!()但实际上不是该序列给予同样的净效应为x.operator bool()的要求(编码准则除外))。实际上,我不希望太多的编译器,甚至试图找出在这种情况下一个机会 - 在分析将是不平凡的,可能不会给很多实际的好处(优化的单指令很少,其中涨幅在编译器进行优化)。再次,这是程序员专注于获得代码清晰正确,而不是担心编译器如何优化这样一个表达式更好。例如,如果调用一个operator bool()意,那么最好是提供一种操作并编写使用它的表达(如bool(x)),而不是希望编译器将像!!x一个黑客转换成x.operator bool()的呼叫。

© www.soinside.com 2019 - 2024. All rights reserved.