【发布时间】:2018-05-20 13:50:07
【问题描述】:
如果我首先验证指向基类的指针是某种类型(使用typeid),是否可以对其执行reinterpret_cast 以节省一些性能?
class Base {
virtual ~Base() {}
};
class A : Base {};
class B : Base {};
...
class Z : Base {};
后来在某处:
void fn(Base & msg) {
const auto & tid = typeid(msg);
if (tid == typeid(A)) {
A * ptr = reinterpret_cast<A*>(&msg);
} else if (tid == typeid(B)) {
B * ptr = reinterpret_cast<B*>(&msg);
} ...
...
} else if (tid == typeid(Z)) {
Z * ptr = reinterpret_cast<Z*>(&msg);
}
}
据我所知,这段代码运行良好,正如我认为的那样。但是,我很好奇这仅仅是因为我很幸运,还是这实际上是定义明确的用法等等?以这种方式使用reinterpret_cast。
在你说为此只使用正常的多态性之前,我无法按原样更改类,因此我需要围绕它进行构建。
【问题讨论】:
-
这里的整个设计看起来难以置信坏了。仅仅重写你无法从头开始改变的相关内容绝对值得考虑。
-
reinterpret_cast不考虑 vtable。您可能会丢失 RTTI 并有未定义的行为。所以不,这是无效的。 -
@BaummitAugen 很乐意,但我只是在修复另一个团队的烂摊子,可悲的是,重写在预算中:/
-
@user1810087 我想知道为什么它无效......我的意思是,在
typeid(*msg) == typeid(Z)之后,我知道它最初是Z 的实例,不是吗?那么为什么用reinterpret_cast<Z*>(&msg)告诉编译器它是Z 的实例是无效的呢?我不明白为什么这里根本需要考虑 vtable...
标签: c++ c++11 visual-c++ visual-studio-2012