2011-05-11 5 views
4

내 프로젝트에서 boost ptree를 사용하고 싶지만 ptree.hpp에 1000 개의 헤더 파일이 포함되어 있기 때문에 컴파일 시간이 크게 늘어납니다 (예 : 1에서 7까지) 20 개 이상의 서로 다른 cpp 파일에 필요하기 때문에 이것은 수용 할 수 없습니다 (미리 컴파일 된 헤더는 많은 것을 향상시키지 않습니다). 그래서 나는 좋은 방법의 반복자를 구현하는 데 실패하고있어, 그러나전달하는 방법 boost :: ptree :: iterator

// myptree.h 
#include <boost/property_tree/ptree_fwd.hpp> 

class myptree { 
    private: 
     boost::property_tree::ptree *m_tree; 

    public: 
     ... 
    // adding new (single value) members to the the tree 
    void put(const std::string&, double); 
    void put(const std::string&, int); 
    void put(const std::string&, const std::string&); 

    // returning (single value) members of the tree 
    double get_double(const std::string&) const; 
    int get_int(const std::string&) const; 
    std::string get_str(const std::string&) const; 

    // working with subtrees 
    void push_back(const std::string&, const myptree&); 
    myptree get_child(const std::string&) const; 

    // import/export 
    void read_from_json(const std::string&); 
    void write_to_json(const std::string&) const; 

}; 

같은 부스트 ​​내 자신의 클래스 ptree, 뭔가를 캡슐화 생각 해요. 이상적으로 boost::property_tree::ptree::iterator 내 개인 멤버 함수를 사용하여 m_tree 통해 반복 될 수있는 개인 멤버 변수를 갖고 싶지만 내가 이해할 때 How do I forward declare an inner class? 일반적으로 불가능합니다. 이 클래스 내에 반복자를 구현하는 우아한 방법?

+0

관련 : http://stackoverflow.com/questions/156936 –

답변

4

귀하의 문제는 Pimpl idiom에 대한 좋은 후보, 일명 컴파일러 방화벽, 일명 핸들 바디이다 (즉, "자동"옵션을 피). 이 내용은 article을 참조하십시오. 당신이 제안하고있는 해결책은 그 숙어와 매우 흡사합니다.

고객의 ptree의 반복기를 숨기려면 this article에 제시된 any_iterator 기술을 확인하십시오.

any_iteratorherehere의 구현을 찾을 수 있습니다.

3

실제 질문에 대한 답변이 좋지 않지만 사전 컴파일 된 헤더 으로 변경해야합니다. 실제로 사용 중이며 헤더가 각 컴파일 장치에서 읽히지 않았습니까? 최적으로 설정하는 것은 약간 까다로울 수 있습니다.

0

답장을 보내 주셔서 감사합니다. 미리 컴파일 된 헤더에 관해서는 실제로 사용 된 (g++ -H은 원래 1460 헤더 파일을 보여 주며 미리 컴파일 된 헤더를 사용할 때는 약 30 개만 사용함) 컴파일 시간이 7 초에서 5.5 초로 줄 었는지 확인했습니다. 이는 약 1 초에 비해 여전히 좋지 않습니다. 위의 캡슐화 된 클래스를 사용합니다.

any_iterator (지금은 부스트 ​​부분 인 것 같습니다)을 시도했을 때 다른 헤더 파일을 수백 개 추가했지만 단순히 포함 시키면 컴파일 시간이 많이 늘어나지 않는다는 것을 깨달았습니다. 그래서 ptree 헤더를 사용하여 동일하게 시도하고 ptree_fwd.hpp 대신 ptree.hpp을 포함 시켰으며 그로 인해 컴파일 시간이 조금 늘어났습니다 (1.1 초에서 1.8 초로 증가). 따라서 ptree 템플릿이 인스턴스화 될 때만 무거운 컴파일 타임 패널티가 발생하는 것 같습니다. 그것은 또한 미리 컴파일 된 헤더가 그다지 도움이되지 않은 이유를 설명 할 수 있습니다. 게으름과 나의 주요 문제가 컴파일 시간 이었기 때문에 나는 다음과 같이 뭔가를 고집 할 수있다 :

// myptree.h 
#include <boost/property_tree/ptree.hpp> 

class myptree { 
    private: 
     boost::property_tree::ptree   m_tree; 
     boost::property_tree::ptree::iterator m_it; 
    ... 
}; 
관련 문제