2010-11-29 12 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; 

इन दो बयानों बराबर (या नगण्य अंतर के साथ) प्रदर्शन होना चाहिए: उदाहरण के लिए, निम्नलिखित घोषणा को देखते हुए उन्हें सही ढंग से समझ में आ (मुझे यकीन है कि मैंने किया था नहीं कर रहा हूँ), get<N> समारोह वास्तव में इस कार्रवाई करता है:

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

यह और अधिक एक निर्देशिका से एक लिंक की गई सूची में एक लुक-अप के समान है ect पहुँच, और, जहां तक ​​मैं undestand, ओ (एन) की बजाय ओ (एन) जटिलता है, जो एक सदस्य के उपयोग से उम्मीद है। बढ़ावा के साथ अपने पिछले अनुभवों से, मुझे लगता है कि मुझे यह गलत तरीके से मिला है; लेकिन मेरी गलती क्या है? get वास्तव में कैसे काम करता है?

+4

मुझे लगता है कि यह संकलन समय अनुकूलन पर भारी निर्भर करता है – Bwmat

उत्तर

6

आप सूची-जैसे प्रदर्शन के बारे में सही हैं। हालांकि, इसे संकलित समय पर हल किया जा सकता है और इसलिए रन-टाइम पर ओ (1) तक उबाल जाता है। (पर्याप्त रूप से अच्छा अनुकूलन संकलक दिया गया है।)

+0

आपका मतलब है, अगर मैं लूप में "पूंछ" को पार करता हूं, तो यह रन टाइम गणना की जाती है, लेकिन अगर मैं सिर्फ 't.tail.tail.tail' लिखता हूं। tail.tail.tail.tail.head' तो आधुनिक कंपाइलर इसे अंतिम आइटम तक सीधे पहुंच के लिए अनुकूलित कर सकते हैं? क्या यह जानने का कोई आसान तरीका है कि मेरा कंपाइलर इसके साथ क्या करता है? – FireAphis

+0

कौन सा कंपाइलर्स वास्तव में अनुकूलन करता है? – Crashworks

+0

एक लूप उतना अच्छा हो सकता है अगर इसे ऑप्टिमाइज़र द्वारा ठीक से अनलॉक किया जा सके। ध्यान दें कि आप एक संरचना से निपट रहे हैं जो संकलन-समय स्थिर है, सामान्य गतिशील डेटा संरचना नहीं। – ltjax

3

याद रखें, सी ++ में, डॉट ऑपरेटर सूचक सूचक नहीं है, यह प्रत्यक्ष ऑफसेट गणना है। सामान्य उत्तर हाँ है, i1.i2.i3.in सभी एन के लिए एक स्थिर समय ऑपरेशन संकलन समय पर गणना योग्य है।

आप, बहुत गहरी खुदाई के बिना इस के लिए संकलक internals के बारे में थोड़ा जानने के LLVM getelementptr http://llvm.org/docs/LangRef.html#i_getelementptr को देखो यह वह जगह है वास्तव में कैसे एक सी ++ बजना की तरह संकलक LLVM को लक्षित करेगी जब एक struct संदर्भ संकलन करना चाहते हैं।

संबंधित मुद्दे