尝试查看哪个演员表更快(不一定更好):新c ++案例或旧时尚C样式演员。有什么想法吗?
答案 0 :(得分:34)
如果您将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
显然,它是100%相同的!
答案 1 :(得分:4)
没有任何区别。
当谈到像单个演员这样的基本构造时,一旦两个构造具有相同的语义含义,它们的性能将完全相同,并且为这些构造生成的机器代码将是相同的。
答案 2 :(得分:3)
我认为实际结果是实现定义的。您应该在您的编译器版本中进行检查。但我相信它会在大多数现代编译器中产生相同的结果。在C ++中,你不应该使用C-cast,而是使用C++ casts - 它将允许你在编译时发现错误。
答案 3 :(得分:2)
使用每种方法查看装配。如果不同则使用分析器。
答案 4 :(得分:1)
它们与编译时自身解析的相同,并且没有运行时开销。即使存在一些差异,我也不会过分关注这些微小(甚至微观)的优化。
答案 5 :(得分:0)
正如大多数人所说的那样,人们希望这些速度应该是相同的速度,尽管你受到编译器的支配......而且这并不总是一个非常幸福的情况。继续阅读战争故事。
取决于您的编译器和程序以float f; int i(f);
,float f; int i = (int)f;
和float f; int i = static_cast<int>(f);
及其同类的速度执行的处理器核心的特定模型(包括涉及double,long和无符号类型)可能非常缓慢 - 比您预期的要差一个数量级。编译器可以发出改变内部处理器模式的指令,从而导致指令流水线被丢弃。实际上,这是编译器的优化元素中的错误。我已经看到了this analysis中提到的40个时钟周期成本的情况,此时你有一个主要的,意想不到的和恼人的性能瓶颈,AFAIK没有完全令人满意的,强大的通用解决方案。有些替代方案涉及汇编程序但是AFAIK它们不会像浮点数那样将浮点数舍入为整数。如果有人知道更好我感兴趣。我希望这个问题很快就会被限制在传统的编译器/硬件上,但是你需要你的智慧。
P.S。我无法访问该链接,因为我的防火墙阻止它与游戏相关,但a Google cache of it足以证明其作者比我更了解它。
答案 6 :(得分:-2)
当你选择对代码没什么影响时,我会选择一个对后来的程序员来说更熟悉的代码。让代码更易于理解的代码总是值得考虑的。在这种情况下,我坚持int(…)
因为这个原因。