LLVM은 역동적 인 캐스트를 피하기위한 규칙에 대한 예외입니까?
-
05-07-2019 - |
문제
LLVM은 RTTI에 대한 RTTI에 대한 대안이있는 RTTI보다 속도가 향상되고 Vtable이없는 클래스에 동적 캐스팅을 허용합니다 ()dyn_cast
). 그러나 여전히 정확히 그대로 사용할 수 있습니다. dynamic_cast<>
더 많은 클래스와 함께 사용할 수 있지만 사용됩니다.
LLVM은 평판이 좋은 C ++ 프로젝트이므로 너무 많은 동적 캐스트가 코드 냄새라고도하는 나쁜 디자인의 표시라고 공통된 말을하는 것처럼 보입니다. 확실히 더 나은 성능의 다이나믹 캐스트는 표준보다 디자인의 사용을 향상시키는 데 아무런 영향을 미치지 않습니다. dynamic_cast
. 그래서 여기에 누가 여기에 있습니까? Dynamic Casting의 대규모 사용이 C ++ 코드에서 좋은 설계 선택 인 경우가 있습니까? Google은 LLVM 트렁크 소스 코드에서 이러한 종류의 동적 캐스팅 690을 나타냅니다.
해결책
성능 히트는 피해야 할 이유입니다 dynamic_cast<>
대규모 계층의 경우 피해야 할 유일한 이유는 아닙니다. 더 나은 성능을 발휘하는지 여부는 더 많이 사용하도록 권장해서는 안됩니다. dyn_cast<>
이 주장 때문에.
반면에 사용하는 데 전혀 잘못된 것이 없습니다. dynamic_cast<>
그것이 직업에 가장 적합한 도구 일 때. 사용이 정당화되고 문제를 해결하는 가장 깨끗한 방법이 있다면 "일반적인 말"에 관계없이 항상 옳습니다.
나는 그들이 사용하기 때문에 단순히 인기있는 프로젝트를 피할 수 없을 것입니다. dynamic_cast<>
에스, goto
호의에서 벗어난 S 또는 다른 관용구.
다른 팁
나는 Dynamics 캐스트가 느리기 때문에 나쁘다고 생각하지만 코드가 너무 단단히 결합되어 있음을 암시하기 때문입니다.
LLVM 문서에서 Dyn_cast 및 ISA의 구현을 매우 빠르게 살펴 보았습니다.
코드의 엑스 맵에는 다음과 같은 것이 있습니다.
struct bar {
bar() {}
private:
bar(const bar &);
};
struct foo {
void ext() const;
/* static bool classof(const bar *X) {
cerr << "Classof: " << X << "\n";
return true;
}*/
};
template <> inline bool isa_impl<foo,bar>(const bar &Val) {
errs() << "Classof: " << &Val << "\n";
return true;
}
테스트는 a로 호출됩니다 B
그리고
if (!isa<foo>(B1)) return;
if (!isa<foo>(B2)) return;
내가 올바르게 무슨 일이 일어나고 있는지 이해한다면 isa
템플릿 (사용합니다 dyn_cast
) 명시 적 전문화를 사용합니다 isa_impl
FOO와 막대를 링크합니다. 주어진 예에서 isa<foo>(B1)
사실을 반환합니다!
어쨌든, 이것은 Dynamic_cast와 매우 다른 행동이므로, 나는 당신이 서로를 비교할 수 있다고 생각하지 않습니다.
분명히, 나는 LLVM이하는 일을 잘못 이해하고있을 수 있으므로 코드를 이해하지 못한 경우 알려주십시오!