2010-11-29 45 views
6

根據boost::tuple documentation,訪問元組的單個元素的性能與訪問成員變量的性能相同。例如,給定下面的聲明:提升元組性能

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

這兩句話應該等於(或微小差別)性能:

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

我看着提升的來源::元組,如果我瞭解他們正確的(我不知道我做了),get<N>功能實際上執行此操作:

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

這更類似於一個鏈表查找比DIR ect訪問,並且,就我而言,具有O(N)複雜性而不是O(1),這是從成員訪問中預期的。從過去的經驗來看,我認爲我錯了;但是我的錯誤是什麼? get如何運作?

+4

我猜這很大程度上依賴於編譯時優化 – Bwmat 2010-11-29 08:36:20

回答

6

您對類似於列表的表現正確無誤。但是,它可以在編譯時解決,因此可以在運行時歸結爲O(1)。 (給定一個足夠好的優化編譯器。)

+0

你的意思是,如果我遍歷for循環中的「尾巴」,它是運行時間計算,但如果我只是寫`t.tail.tail.tail。 tail.tail.tail.tail.head`那麼現代編譯器可以優化它以直接訪問最終項目?有沒有一種簡單的方法來知道我的編譯器用它做什麼? – FireAphis 2010-11-29 08:40:32

3

請記住,在C++中,點運算符不是指針參數,它是直接偏移量計算。一般的答案是肯定的,對於所有的n,i1.i2.i3.in是一個在編譯時可以計算的常量時間操作。

如果您想深入瞭解一些有關編譯器內部構件的內容,請查看LLVM getelementptr http://llvm.org/docs/LangRef.html#i_getelementptr這正是C++編譯器如CLANG在編譯結構引用時的目標LLVM的目標。