【发布时间】:2017-06-11 23:16:00
【问题描述】:
考虑这个类层次结构:
struct Animal { virtual ~Animal(); };
struct Cat : virtual Animal {};
struct Dog final : virtual Animal {};
我的理解是,将final 放在class Dog 上可以确保没有人可以创建一个继承自Dog 的类,这必然意味着没有人可以创建一个IS-A Dog 和IS -A Cat 同时。
考虑这两个dynamic_casts:
Dog *to_final(Cat *c) {
return dynamic_cast<Dog*>(c);
}
Cat *from_final(Dog *d) {
return dynamic_cast<Cat*>(d);
}
GCC、ICC 和 MSVC 忽略 final 限定符并生成对 __dynamic_cast 的调用;这很不幸,但并不奇怪。
令我惊讶的是,Clang 和 Zapcc 都是 generate 的最佳代码 from_final (“总是返回 nullptr”),但会为 to_final 生成一个对 __dynamic_cast 的调用。
这真的是一个错过的优化机会吗(在编译器中,显然 有人 付出了一些努力来尊重强制转换中的final 限定符),或者在这种情况下由于某些微妙的原因无法进行优化我还没看到?
【问题讨论】:
-
我的猜测是,这种情况不会经常出现,以至于大多数编译器都不会过分担心。优化是为了响应现实世界对效率的共同需求而实施的。
-
@cdhowie:你可能是对的;但让我停下来的是,显然有人确实在
from_final案例中编写了Clang 优化。to_final案例是对称的(特别是在 codegen 方面,它会为两种类型提取 typeinfo),但未知的人 not 添加了对称优化。 “明显的半实现优化”在我的大脑中似乎比“根本没有优化”更奇怪(参见 GCC、ICC、MSVC)。
标签: c++ polymorphism final dynamic-cast