문제

LLVM은 RTTI에 대한 RTTI에 대한 대안이있는 RTTI보다 속도가 향상되고 Vtable이없는 클래스에 동적 캐스팅을 허용합니다 ()dyn_cast). 그러나 여전히 정확히 그대로 사용할 수 있습니다. dynamic_cast<> 더 많은 클래스와 함께 사용할 수 있지만 사용됩니다.

dyn_cast<> 템플릿 문서

LLVM은 평판이 좋은 C ++ 프로젝트이므로 너무 많은 동적 캐스트가 코드 냄새라고도하는 나쁜 디자인의 표시라고 공통된 말을하는 것처럼 보입니다. 확실히 더 나은 성능의 다이나믹 캐스트는 표준보다 디자인의 사용을 향상시키는 데 아무런 영향을 미치지 않습니다. dynamic_cast. 그래서 여기에 누가 여기에 있습니까? Dynamic Casting의 대규모 사용이 C ++ 코드에서 좋은 설계 선택 인 경우가 있습니까? Google은 LLVM 트렁크 소스 코드에서 이러한 종류의 동적 캐스팅 690을 나타냅니다.

사용 dyn_cast<> LLVM 트렁크에서

도움이 되었습니까?

해결책

성능 히트는 피해야 할 이유입니다 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이하는 일을 잘못 이해하고있을 수 있으므로 코드를 이해하지 못한 경우 알려주십시오!

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top