2010-11-18 3 views
0

질문에 도움이 Fast and flexible iterator for abstract class 나는 추상 클래스 GridData에 대한 추상 GridIterator를 만들었습니다. 이제 GridIterator의 구체적인 하위 클래스를 사용하여 GridData의 구체적인 하위 클래스를 반복 할 수 있습니다.개체 지향 Iterator 클래스의 속도를 높이려면 어떻게해야합니까?

그러나 테스트 중에 가상 연산자 ++와 가상 연산자 *가 내 알고리즘의 실제 병목 현상이된다는 것을 알았습니다. 속도를 높이기 위해 할 수있는 일이 있는지 궁금합니다. 추상화 때문에 인라인은 아마도 나에게 효과가 없을 것입니다.

나는 const Iterator도 제공하고 싶습니다. 현재 클래스 디자인으로이 작업을 수행하는 방법을 잘 모르겠습니다. 내 원래의 질문 (Fast and flexible iterator for abstract class)를 참조, 난 그냥 const 대신 const T는 TTL 반복기 STL에서 하위 클래스로 ConstGridIterator를 만들 수 있습니까? 아니면 모든 단일 반복기 클래스 (GridIterator 및 baseImpl)의 const 버전을 구현해야합니까?

답변

3

STL로 수행하고 반복자 또는 컨테이너에서 가상 메서드를 사용하지 마십시오. 대부분의 컴파일러는 최적화를 요청 받았을 때 대부분의 STL 반복자를 완전히 무시할 수 있도록 최적화 할 수 있으며 개체 파일에도 존재하지 않습니다. 예를 들어 *(vector<T>.begin()+5)vector<T>::iterator이 생성자, 소멸자 및 복합 연산자 재 정의가있는 복합 클래스 인 경우에도 vector<T>.__underlying_array[5]으로 최적화 할 수 있습니다. 어디 operator++, begin(), end() 또는 operator !=()의 호출 스택에서 가상 메서드 호출을 갖는

는 방법은 무엇에 의해 재정의 될 수 있기 때문에 올바르게을 최적화 할 수있는 컴파일러를 방지합니다. 가상 메소드는 런타임 오버 헤드가 작을뿐만 아니라 모듈을 모듈화하여 코드를 최적화 할 수 없도록 만듭니다.

성능을 원하면 상속 대신 템플릿을 사용하거나 컴파일러를 조정하여 아무도이 클래스를 상속받지 않는다고 말하십시오. 이것은 현재 디자인과 충돌 할 수 있지만 성능, 모듈성 및 비용이라는 두 가지 우선 순위 중에서 선택해야합니다.

관련 문제