2012-07-26 27 views
0

这是一个纯粹好奇的问题,我不认为答案可能会导致很大的改进。铸造一个对象两次vs一次表演

让我们假设有这种树的继承:

  A 
     /\ 
     / \ 
     AB  AC 
     /\  /\ 
    ABB ABC ACB ACC 

我要编写一个执行型动物的行为基础上的对象类型的函数。 我100%确定这个对象只能是一个AC对象或它的一个子对象。

现在它的代码是更快:

int t = getObjectType(); 
A* obj = getObject(); 
switch (t) { 
     case 0: 
     ACB* casted_obj = static_cast<ACB*>(obj); 
     case 1: 
     ACC* casted_obj = static_cast<ACC*>(obj); 
} 

int t = getObjectType(); 
A* sup = getObject(); 
AC* obj = static_cast<AC*>(sup); 
switch (t) { 
     case 0: 
     ACB* casted_obj = static_cast<ACB*>(obj); 
     case 1: 
     ACC* casted_obj = static_cast<ACC*>(obj); 
} 

或许C++标准不说如何继承树必须管理什么,所以答案取决于实现。

+0

这两个代码都是*错误*:你忘了'break'。 – kennytm 2012-07-26 13:41:22

+0

此外,[你不能在开关中声明变量](http://stackoverflow.com/q/92396/912144),但我们得到的主旨。 – Shahbaz 2012-07-26 13:44:29

回答

2

静态转换完全在编译时完成,因此性能影响将始终为零。在运行时唯一完成的类型是dynamic_cast。更多:http://www.cplusplus.com/doc/tutorial/typecasting/

+0

这不是事实。例如,如果有多个基类,则'static_cast'可以改变指针的值。 – 2012-07-26 14:40:41