您会在频繁运行的方法中使用动态转换吗?有没有 开销很大?
dynamic_cast 返回的指针到底是什么。指向同一地址的指针? 指向不同实例的指针?我缺乏这种理解。更具体地说—— 只有在运行时,我才希望对父类型的指针进行赋值 原来是一个指向儿子类型的指针。解决方案?
谢谢。
最佳答案
dynamic_cast
帮助您在执行向下转换时检查有效性。
如果指针或引用不能安全向下转型,它返回 NULL 或抛出异常(std::bad_cast
用于引用)。
您会在频繁运行的方法中使用动态转换吗?开销大吗?
dynamic_cast
确实使用一些额外的 RTTI(运行时类型信息)
来确定转换的有效性。所以肯定有开销。通常,指向类型
的typeinfo
的指针将添加到虚拟表
。我说通常,因为虚拟机制本身是依赖于编译器实现的细节(可能因不同的编译器而异)。
您必须使用一些好的分析工具来分析您的代码,以确定重复调用 dynamic_cast
是否会降低代码的性能。
dynamic_cast
返回的指针到底是什么。指向同一地址的指针?指向不同实例的指针?
如果不使用dynamic_cast
分析向下转型,而是分析向上转型,则更容易理解。给定类型 base
和另一个继承自 base
的类型 derived
,derived
类型将包含类型的子对象基础
。当指向 derived
对象的指针被向上转换为指向 base
的指针时,操作的结果将是 base
子对象的地址 < em>内部 派生
。执行 dynamic_cast
会恢复该操作,并返回指向 derived
对象的指针,该对象在作为参数传递的地址中包含 base
子对象(static_cast
做同样的事情,但它会应用可能的偏移量而不实际检查运行时类型。
在最简单的情况下,在单(非虚拟)继承的情况下,derived
子对象将与 base
对齐,但在多重继承的情况下,则不会案例:
struct base {
int x;
virtual void foo() {}
};
struct another_base {
virtual void bar() {}
};
struct derived : base, another_base {};
int main() {
derived d;
base * b = &d; // points to the base subobject inside derived
another_base * o = &d; // points to the another_base subobject inside derived
std::cout << std::boolalpha
<< ( static_cast<void*>(b) == dynamic_cast<derived*>(b) ) << "\n"
<< ( static_cast<void*>(o) == dynamic_cast<derived*>(o) ) << std::endl;
}
程序将打印true
、false
。请注意,如果要比较它们,您必须将其中一个指针显式转换为 void*
,否则编译器将对向下转换 指针执行隐式向上转换。 p>
关于c++ - 两个 dynamic_cast 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6354449/