你会在频繁运行的方法中使用动态强制转换吗?它有很大的开销吗?
究竟是dynamic_cast返回的指针是什么.指向同一地址的指针?指向不同实例的指针?我缺乏这种理解.更具体 - 只有在运行时它被证明是一个指向子类型的指针时,我希望对父类型的指针进行赋值.解决方案?
谢谢.
dynamic_cast 帮助您在执行向下转换时检查有效性.
std::bad_cast如果无法安全地下载指针或引用,则返回NULL或抛出异常(对于References).
你会在频繁运行的方法中使用动态强制转换吗?它有很大的开销吗?
dynamic_cast确实使用一些额外的东西RTTI(Run Time Type Information)来确定演员表的有效性.所以肯定有一个开销.典型地,一个指针到typeinfo的type将被添加到所述virtual table.我通常说,因为虚拟机制本身是编译器实现依赖的细节(可能因不同的编译器而异).
您必须使用一些好的分析工具来分析您的代码,以确定dynamic_cast重复调用是否会降低代码的性能.
究竟是指针返回的是什么dynamic_cast.指向同一地址的指针?指向不同实例的指针?
通过我们分析向上转换而不是分析向下转换,更容易理解.给定一个继承自的类型和另一种类型,该类型将包含一个类型的子对象.当指向对象的指针被上传到指针时,操作的结果将是内部子对象的地址.执行还原该操作,并返回指向包含作为参数传递的地址中的子对象的对象的指针(执行相同操作,但它将应用可能的偏移而不实际检查运行时类型).dynamic_castbasederivedbasederivedbasederivedbasebase deriveddynamic_castderivedbasestatic_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;
}
Run Code Online (Sandbox Code Playgroud)
该程序将打印true,false.请注意,void*如果要比较它们,则必须显式地转换其中一个指针,否则编译器将执行隐式向上转换指向下的指针.