gpt4 book ai didi

c++ - 我应该在任何时候使用 dynamic_cast 进行向下转换吗?

转载 作者:行者123 更新时间:2023-12-03 10:32:58 25 4
gpt4 key购买 nike

我注意到当以下操作是非多态时,编译器会优化一些 dynamic_cast,例如以下代码:


#include <iostream>

using namespace std;

struct A
{
virtual ~A() = default;
virtual int f()
{
return 1;
};
virtual int g() = 0;
};

struct B : A
{
int g() const
{
return 2;
}
int g() override
{
return 3;
}
int h()
{
return 4;
}
};

int main()
{
A* p = new B();
auto u = p->f();
auto v1 = static_cast<B*>(p)->f();
auto v2 = dynamic_cast<B*>(p)->f();
auto w = p->g();
auto x1 = static_cast<const B*>(p)->g();
auto x2 = dynamic_cast<B*>(p)->g();
auto x3 = dynamic_cast<const B*>(p)->g();
auto y = dynamic_cast<B*>(p)->h();
cout << u << v1 << v2 << w << x1 << x2 << x3 << y << endl;
delete p;
return 0;
}


只有两个使用 g++ -O2 编译的 dynamic_cast 调用,这意味着它等于 static_cast,所以我应该总是使用 dynamic_cast 进行向下转换而不需要考虑额外的开销吗?

最佳答案

dynamic_cast 的主要问题是它们非常缓慢和复杂。编译器确实可以在编译时知道实际类型时对其进行优化,但并非总是如此。从技术上讲,如果编译器知道如何正确执行,您的代码应该有 0 个动态转换。所以不要太相信编译器使用的确切优化机制。

您的代码的某些部分可能已经通过滥用未定义的行为进行了优化。例如:

dynamic_cast<B*>(p)->f(); 
// this is optimized instantly to p->f();
// if dynamic_cast returns nullptr it would be undefined behavior IIRC,
// so optimizer can assume that the cast is successful and it becomes equivalent to
// static_cast<B*>(p)->f() after optimization,
// regardless of whether p is actually of type B or not

一般来说,很难提供关于动态转换的具体方法,如果性能允许,总是动态转换向下转换。不这样做可能是未定义的行为和安全漏洞。

如果您不能保证派生类属于这种特定类型 - 您别无选择,只能使用动态转换。

如果您有保证但代码中可能存在错误,请考虑在内部使用动态转换创建静态断言,并在优化版本中使用静态转换。

关于c++ - 我应该在任何时候使用 dynamic_cast 进行向下转换吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58129663/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com