【发布时间】:2019-11-06 09:32:16
【问题描述】:
对于我的一个项目,我终于需要使用我的第一个多态类(std::cout 除外)。
我正在研究如何确保至少在某些情况下我有 100% 的非虚拟化调用。
这段代码合法可行吗?
dynamic_cast 会有多慢?如果我在构造函数中支付一次,那么我将始终可以直接使用 B 类,所以这听起来不错?
C 风格转换之后会很快还是我必须存储指向B 的指针?
struct A{
virtual void x();
};
struct B : A{
void x() override;
};
struct X{
A *a;
bool fB;
X(A &a) : a(&a), fB( dynamic_cast<B *>(&a) ){}
void f(){
if (fB){
((B*)a)->x();
}else{
a->x();
}
}
};
void fn(A &a){
X x(a);
x.f();
}
int main(){
B b;
X x(b);
x.f();
}
【问题讨论】:
-
多态性的好处是虚函数将被解析并自动调用正确的类。所以你不需要
fB或动态演员表。只需void f() { a->x(); }应该可以正常工作。 -
作为一般提示:所有 C 风格的转换都应该被视为你做错了什么的危险信号。
-
看来你没有抓住重点。循环调用非去虚拟化的虚函数,每次都会解析虚函数。
-
因为我想要性能,但我不想改变
X的类型,否则我会使用模板 -
那么自然而然的后续问题是,您是否已将其视为程序中的前一两个瓶颈?所有手动和手工优化(包括编译时多态性或其他绕过虚拟分派的尝试)都会导致代码晦涩难懂,需要大量文档来解释所做的事情以及原因。它也往往会导致模糊的错误,需要大量的额外测试。如果做得不好,根本不会导致“效率”发生任何(实际或感知的)变化。
标签: c++ devirtualization