2014-11-09 3 views
1

나는 파생 클래스 자체 인 계층 구조에서 요소의 루트를 가져 오는 두 가지 설계에 직면하고 있습니다. 호기심과 마찬가지로 가장 우아함이 가장 효율적 인지도 궁금합니다. else가있는 경우 루트를 얻기 위해 가상 함수를 사용하는 대신if/else vs virtual function : 디자인 성능

class Element 
{ 
public: 
    Root* root() 
    { 
     if(mParent) 
      return mParent->root(); 
     else 
      return static_cast<Root*>(this); 
    } 
protected: 
    Element* mParent; 
}; 

class Root : public Element 
{}; 

그리고 여기에 더 우아한 : 다음은 덜 우아한 버전입니다.

class Element 
{ 
public: 
    virtual Root* root() { return mParent->root(); } 
protected: 
    Element* mParent; 
}; 

class Root : public Element 
{ 
public: 
    virtual Root* root() { return this; } 
}; 

그 것 제가 조기에 성능에 대해 걱정하지 말아야 알고, 난 이미 두 번째 옵션을 선택했다,하지만 난 어떤 요인이 있는지 알고 (캐시 미스가?), 이론적 인 수준에서 궁금 기능이 요소에 의해 매우 자주 호출되는 상황에서 한 접근법을 다른 접근법보다 우월하게 만드십시오.

참고 : 계층 구조가 5 ~ 20 개 요소의 순서로 정보를 추가하면이 질문이 너무 광범위하다고 생각하지 않습니다. 사실 꽤 실용적인 질문입니다.

+0

두 가지 방법으로 프로그램 실행을 측정해야합니다. –

+0

@NOvember 내가 먼저 말할 수있게 해주세요 : _yikes_. 부모 클래스를 하위 클래스처럼 취급하는 것이 좋은 생각 인 상황을 이해하도록 도와 줄 수 있습니까? 부모 클래스를 부모 클래스로 취급하지 않으면 왜 부모 함수 만 호출할까요? –

+0

투표가 "너무 광범위하다"고 투표했습니다. 저는 이것에 대해 박사 학위 논문을 쓸 수 있다고 믿습니다. –

답변

3

호기심과 마찬가지로, 가장 우아한 것이 도 가장 효율적인지 궁금합니다.

비정형. 좋은 디자인을 찾으려면 시간과 경험이 필요합니다. 그것을 더 많이 최적화하고 실패하기 쉽습니다. 실제로 말할 것이 많지만 범위를 좁히려고합니다.

  • 성능이 필요한가요? CRTP를 사용하십시오. 나는 또한 switch 진술을 보았습니다. 그러나 그것은 당신의 극한치 일 것입니다.
  • 좋은 디자인? 가상 함수를 사용하십시오. 그들은 매우 일반적입니다 (예 : std::streambuf). 많은 언어가 문자 그대로 사방 (인터페이스 등)에서 사용할 수 있습니다. 예, 비용이 들지만 길지 않은 루프가 아니면 코드를 눈에 띄지 않습니다. 고주파가 필요합니다.
  • 둘 다요? 윤곽! 전화 비용을 측정하고 추론해야하며, 너무 비싸면 더 빨리 갈 방법을 모색해야합니다. 그러나 프로필을 작성하려면 작업 할 기반이 있어야합니다.