编译器是否消除了不必要的“dynamic_cast”
Does the compiler eliminate unnecessary `dynamic_cast`s?
我正在编写一个繁重的模板化应用程序。在它的某个地方,有一些类似的代码:
class TA { };
class TX {
public:
template <typename T>
T &Foo(int a) {
TA *pta;
// here somehow initialize pta
return *(dynamic_cast<T*>(pta));
}
};
如果我用T = TA
调用Foo
模板成员函数,编译器是否会消除或优化动态转换dynamic_cast<TA*>(pta)
[其中pta
的类型为TA*
]?还是我应该制作一些type_traits
魔术来手动消除它?
是的,如果编译器能够确定强制转换总是成功的,那么它将省略运行时检查。在你的情况下,由于演员阵容微不足道,所以不会失败。
如果类型相同,则根本不进行转换。在C++标准中,5.2.7:
dynamic_cast<T>(v)
如果v的类型与T相同,或者它与T相同——除了T中的类对象类型比v中的类目标类型更具cv限定性之外,结果是v(必要时转换)
如果要转换为的类型是指向子类的指针或引用,则也没有运行时检查:
如果T是"指向cv1 B的指针",v的类型为"指向cv2 D的指针"使得B是D的基类,则结果是指向v所指向的D对象的唯一B子对象的指针。
您已经编写了一个模板,而不是简单的代码,这不会改变优化决策。你的代码相当于这个:
struct S {};
S *foo(S *a)
{
return dynamic_cast<S*>(a);
}
具有基本优化的(g++ -O1
)将编译为:
S *foo2(S *a)
{
return a;
}
相关文章:
- 如何理解C++标准N3337中的expr.const.cast子句8
- C++Cast运算符过载
- 在成员dynamic_bitset上使用 boost::from_block_range 时出错,但在本地dynamic
- C++类中的二维"dynamic"数组?
- 错误:"cast"未命名类型void setCastDescription(std::string
- 通过使用 const-cast 的非常量引用来延长临时的寿命
- "(void) cast"与功能有什么区别 "__attributes__"来沉默未使用的参数警告?
- protobuf in C++ with dynamic binding for google::protobuf::M
- 警告的原因是什么:"when type is in parentheses, array cannot have dynamic size"?
- C++:"Expected '(' for function-style cast or type construction"错误
- 为什么选择 g++ 给予者:"error: cast to pointer from integer of different size [-Werror=int-to-pointer-cast]"
- CUDA 错误:"dynamic initialization is not supported for __device__, __constant__ and __shared__ variabl
- Gtk+ g_signal_connect() 和 C++ lambda 会导致"invalid cast"错误
- 如何修复'The procedure entry point SDL_RWclose could not be located in the dynamic link library'
- Shared_ptr cast vs static_cast speed
- 在 iOS 上使用 Aruco 构建 OpenCV 时"Functional-style cast from id to double is not allowed"
- "The ordinal 344 could not be located in the dynamic link library"
- 覆盖 CAST 运算符(我认为它被称为向下转换)
- Dynamic Cast C++ Fail
- dynamic-cast-c++dynamic_cast错误处理