Ric*_*ons 4 c++ polymorphism casting
将指向实例类的实例的指针强制转换为实例基类在C++中是否有任何运行时开销,还是在编译时解析?
如果确实有,那么在铸造操作中究竟需要计算什么?
例:
class Foo;
class Bar : public Foo;
Bar* y = new Bar;
Foo* x = (Foo*) y;
Run Code Online (Sandbox Code Playgroud)
(我知道我应该使用C++风格的演员表,答案可能与他们相同)
Foo* x = (Foo*) y;
Run Code Online (Sandbox Code Playgroud)
你不需要投Bar*来Foo*.从Derived到Base的转换是隐含的:
Foo* x = y ; // is enough!
Run Code Online (Sandbox Code Playgroud)
至于多态演员,C风格演员不等同于dynamic_cast.C++ dynamic_cast完全是一种添加到语言中的新功能,并且在C风格的转换中没有匹配.
将指向实例类的实例的指针强制转换为实例基类在C++中是否有任何运行时开销,还是在编译时解析?
如果你像我上面那样做,那么在编译时解析从派生到基础的转换.所以它没有运行时开销.
是的,虽然它可以忽略不计.
在这种情况下,C样式转换被解释为a static_cast,这可能会引起指针调整.
struct Base {};
struct Derived: Base { virtual ~Derived(); } // note: introduced a virtual method
int main()
{
Derived derived;
Base* b = &derived;
Derived* d = (Derived*) b;
void* pb = b;
void* pd = d;
printf("%p %p", pb, pd);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
只要基础子对象未与派生对象在同一地址对齐,就会发生此开销,这种情况发生在:
当然,指针调整通常被认为是可以忽略不计的,并且编译器应该足够聪明,如果它不必要的话(消除0的调整)就消除它.
注意:这是依赖于实现的,不是标准规定的