哪个强制转换更快static_cast <int>()或int()</int>

时间:2009-10-22 17:28:05

标签: c++ c performance

尝试查看哪个演员表更快(不一定更好):新c ++案例或旧时尚C样式演员。有什么想法吗?

7 个答案:

答案 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(…)因为这个原因。