2010-11-29 4 views
6

boost::tuple documentation에 따르면 튜플의 단일 요소에 액세스하는 것은 멤버 변수에 액세스하는 것과 동일한 성능을 제공합니다. 내가 경우부스트 튜플 성능

t1.get<2>(); 
t2.c; 

내가 부스트의 근원 :: 튜플로 보았다 :

tuple<A, B, C> t1(A(), B(), C()); 
struct T { A a; B b; C c; } 
T t2; 

이 두 문장이 동일한 (또는 무시할 차이) 성능을 가져야한다 : 예를 들어, 다음 선언을 제공

C get<2>(tuple<A, B, C>& t) 
{ 
    return t.tail.tail.head; 
    //Generally: return t.tail. <<N times>> .head; 
} 

이이 디렉토리보다 링크 된 목록에서 룩업에 더 유사합니다, get<N> 기능은 실제로이 작업을 수행하는 (나는 내가 한 확실하지 않다) 정확하게 이해 (undestand) 한도 내에서 O (1) 대신 O (N) 복잡성을 가지며 이는 구성원 액세스에서 예상됩니다. 후원에 대한 나의 과거의 경험에서, 나는 잘못 생각한 것 같습니다. 하지만 내 실수는 뭐니? get은 실제로 어떻게 작동합니까?

+4

나는 컴파일 시간 최적화에 크게 의존한다고 생각한다. – Bwmat

답변

6

목록과 비슷한 성능에 대해 정확합니다. 그러나 컴파일 타임에 해결할 수 있으므로 실행시 O (1)로 내려갑니다. (충분히 좋은 최적화 컴파일러가 주어진다.)

+0

for 루프에서 "tails"을 트래버스하면 실행 시간이 계산되지만't.tail.tail.tail '이라고 쓰면된다. tail.tail.tail.tail.head'을 사용하면 최신 컴파일러가이를 최적화하여 최종 항목에 직접 액세스 할 수 있습니까? 제 컴파일러가 그것을 어떻게하는지 쉽게 알 수 있습니까? – FireAphis

+0

어떤 컴파일러가 실제로 최적화를 수행합니까? – Crashworks

+0

루프가 최적화 프로그램에 의해 적절하게 풀릴 수 있으면 루프가 양호 할 수 있습니다. 여기서는 일반적인 동적 데이터 구조가 아닌 컴파일 타임 상수 인 구조체를 다루고 있음에 유의하십시오. – ltjax

3

C++에서 도트 연산자는 포인터 기준이 아니므로 직접 오프셋 계산입니다. 일반적인 대답은 yes입니다. i1.i2.i3.in은 모두 n이 컴파일 타임에 계산 가능한 일정한 시간 연산입니다.

매우 깊게 파고 가지 않고 컴파일러 내부에 대해 조금 배우고 싶다면 LLVM getelementptr을보십시오. http://llvm.org/docs/LangRef.html#i_getelementptr 이것은 구조 참조를 컴파일 할 때 CLANG와 같은 C++ 컴파일러가 LLVM을 대상으로하는 것과 정확히 같습니다.