多态C风格的演员有任何开销吗?

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++风格的演员表,答案可能与他们相同)

Naw*_*waz 5

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++中是否有任何运行时开销,还是在编译时解析?

如果你像我上面那样做,那么在编译时解析从派生到基础的转换.所以它没有运行时开销.


Mat*_* M. 5

是的,虽然它可以忽略不计.

在这种情况下,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的调整)就消除它.

注意:这是依赖于实现的,不是标准规定的