我对C++样式的强制转换非常陌生,而且担心使用C++样式的强制转换会破坏应用程序的性能,因为我的中断服务例程中有一个实时关键期限。
我听说有些演员甚至会抛出异常!
我想使用C++样式的强制转换,因为它将使我的代码更加“健壮”。但是,如果有任何性能影响的,那么我可能不会使用C++样式的强制转换,而是将花费更多的时间来测试使用C风格的转换的代码。
有没有人做过任何严格的测试/分析来比较C++风格的转换和C风格的转换的性能?
你的结果是什么?
你得出了什么结论?
发布于 2009-03-23 19:54:16
如果C++样式的强制转换可以从概念上被C风格的强制转换所取代,那么就不会有开销。如果它不能,就像dynamic_cast的情况一样,因为它没有C等价物,那么您必须以某种方式支付成本。
例如,以下代码:
int x;
float f = 123.456;
x = (int) f;
x = static_cast<int>(f);使用VC++ -代码为两种强制转换生成相同的代码如下:
00401041 fld dword ptr [ebp-8]
00401044 call __ftol (0040110c)
00401049 mov dword ptr [ebp-4],eax当转换到引用时,唯一可以抛出的C++强制转换是dynamic_cast。要避免这种情况,请将其转换为指针,如果转换失败,指针将返回0。
发布于 2009-03-23 19:52:39
运行时唯一有额外成本的是dynamic_cast,它的功能无论如何都不能用C样式的强制转换直接再现。所以你没问题。
让自己放心的最简单的方法是指示编译器生成汇编程序输出,并检查它生成的代码。例如,在任何实现良好的编译器中,reinterpret_cast都会完全消失,因为它只是意味着“盲目地继续,假装数据属于这种类型”。
发布于 2009-03-23 21:10:53
有四种C++风格的类型:
const_caststatic_castreinterpret_castdynamic_cast如前所述,前三个是编译时操作.使用它们没有任何运行时间的处罚。它们是给编译器的消息,需要以另一种方式访问已声明为一种方式的数据。“我说这是一个int*,但是让我把它当作指向sizeof(int) chars的char*来访问”或者“我说这个数据是只读的,现在我需要把它传递给一个不会修改它的函数,但是不接受参数作为const引用。”
除了通过转换到错误的类型和对数据进行重击(C风格的强制转换总是有可能)数据损坏之外,这些转换中最常见的运行时问题是那些实际上被声明为const的数据可能无法传递给非const。将声明的const转换为non,然后修改它是未定义的。未定义意味着你甚至不能保证会有坠机。
dynamic_cast是一个运行时结构,必须有一个运行时成本。
这些转换的价值在于,它们具体地说明了您试图从/到,突出的视觉效果,并且可以使用脑死亡工具进行搜索。我建议使用它们,而不是使用C风格的转换。
https://stackoverflow.com/questions/674982
复制相似问题