尝试看哪种转换更快(不一定更好):新的C++风格转换还是旧式的C风格转换。有什么想法吗?
尝试看哪种转换更快(不一定更好):新的C++风格转换还是旧式的C风格转换。有什么想法吗?
如果您将int()
与static_cast<int>()
的等效功能进行比较,则两者没有任何区别。
在使用VC2008时:
double d = 10.5;
013A13EE fld qword ptr [__real@4025000000000000 (13A5840h)]
013A13F4 fstp qword ptr [d]
int x = int(d);
013A13F7 fld qword ptr [d]
013A13FA call @ILT+215(__ftol2_sse) (13A10DCh)
013A13FF mov dword ptr [x],eax
int y = static_cast<int>(d);
013A1402 fld qword ptr [d]
013A1405 call @ILT+215(__ftol2_sse) (13A10DCh)
013A140A mov dword ptr [y],eax
显然,它完全相同!
没有任何区别。
当涉及到单个转换这样的基本结构时,一旦两个结构具有相同的语义意义,它们的性能将完全相同,并且为这些结构生成的机器代码将是相同的。
我认为实际结果是由实现定义的。您应该在您的编译器版本中进行检查。但我相信,在大多数现代编译器中,它会给出相同的结果。在C++中,您不应该使用C-cast,而应该使用C++ casts - 这将允许您在编译时发现错误。
使用每种方法查看汇编代码,如果有差异,请使用分析器。
它们与编译时解决的相同,没有运行时开销。即使有一些差异,我也不会太在意这些微小(甚至不到微观)的优化。
正如大多数人所说,希望它们应该是相同的速度,尽管你要受编译器的支配...而这并不总是一个非常愉快的情况。继续阅读战争故事。
根据您的编译器和程序执行的处理器核心型号,float f; int i(f);
、float f; int i = (int)f;
和 float f; int i = static_cast<int>(f);
等(包括涉及 double、long 和 unsigned 类型的变体)的速度可能非常慢 - 比您预期的要慢一个数量级。编译器可能会发出指令来改变内部处理器模式,导致指令流被丢弃。这实际上是编译器优化元素中的一个错误。我见过一些情况,在this analysis中提到了40个时钟周期的成本,此时您将面临一个重大的、意外的和令人恼火的性能瓶颈,而且没有完全令人满意、稳健、通用的解决方案。有一些使用汇编语言的替代方法,但据我所知,它们不能像转换一样将浮点数舍入为整数。如果有人知道更好的方法,请告诉我。我希望这个问题现在/将来很快就会被限制在遗留的编译器/硬件上,但您需要保持警惕。
附言:我无法访问那个链接,因为我的防火墙已经将其阻止,原因是与游戏相关,但是它的谷歌缓存足以证明作者比我更了解它。
当你的选择对代码并没有太大影响时,我会选择那个看起来更熟悉、更容易被后来的程序员理解的选项。让代码更易于他人理解始终值得考虑。在这种情况下,出于这个原因,我会坚持使用int(…)
。
int(10.4)
不是C风格的转换,因为它不是有效的C语言(它调用了带有参数的函数int()
)。"C风格"的转换是(int)10.4
。 - Chris Lutz