2011-03-05 11 views
5

कुछ जांच के बाद, मैंने पाया कि सी ++ 0 एक्स तत्वों को स्मृति में पीछे की तरफ टुपल में संग्रहीत करता है।सी ++ 0 एक्स टुपल्स स्टोर एलिमेंट्स पीछे

उदाहरण के लिए, इस कोड को ले:

std::tuple<char, char, char> x('\0', 'b 'a'); 
char* y = (char*)&x; 
std::cout << sizeof(x) << std::endl; 
std::cout << y << std::endl;

जब जीसीसी 4.5.2 के साथ संकलित, मैं निम्नलिखित उत्पादन प्राप्त करें:

3 
ab

यह शुरू में मुझे हैरान। डेटा पीछे की ओर क्यों संग्रहीत किया जाता है? जीएनयू के अनजाने में अस्पष्ट हेडर के माध्यम से शिकार करने के बाद, मैंने देखा है कि कार्यान्वयन इस के समान था:

template<typename head, typename... tail> class tuple<head, tail...> : public tuple<tail...> 
{ 
    head value; 
    ... 
};

क्योंकि आधार वर्ग पिछले तत्व होता है, तो अगले व्युत्पन्न वर्ग आदि पिछले करने के लिए दूसरा, वास्तविक शामिल टेम्पलेट तर्कों का क्रम उलट दिया गया है।

जब मैं पहली बार tuples में मिला है, मैंने सोचा था कि मैं उन्हें glInterleavedArrays() की तरह एक समारोह है, जो रंग की tuples, बनावट निर्देशांक, Normals, और अंक के रूप में शिखर डेटा की एक सरणी सेट के लिए इस्तेमाल कर सकते हैं। बेशक, यदि मैं tuples की एक सरणी बना देता हूं, तो इस डेटा को रिवर्स में इनपुट करना होगा, जिसके परिणामस्वरूप वास्तव में अजीब बग हो सकती हैं यदि आप सही क्रम में तर्क डालना भूल जाते हैं।

इस तरह कुछ के बारे में क्या?

template<typename... head, typename tail> class tuple<head..., tail> : public tuple<head...> 
{ 
    tail value; 
    ... 
};

जीसीसी 4.5.2 के तहत:

error: parameter pack argument ‘head ...’ must be at the end of the template argument list

जब तक यह भविष्य में उपलब्ध हो जाता है, मैं बहुत ज्यादा इस लागू करने के लिए एक और रास्ता खोजने पर अटक कर रहा हूँ। क्या कोई और तरीका है? जीसीसी को सही तरीके से आदेशित टुपल मेमोरी-वार प्राप्त करने के लिए कुछ तरीका है?

उत्तर

5

टुपल लेआउट जिसे आप एक्सप्लोर कर रहे हैं वह टुपल का एक अनिर्दिष्ट कार्यान्वयन विवरण है। अन्य कार्यान्वयन में अन्य लेआउट होंगे। यदि आप इसे लिखते हैं, तो जीसीसी के लेआउट के आधार पर, आपका कोड अन्य std :: libs पर पोर्टेबल नहीं हो सकता है।

libc++ टुपल कार्यान्वयन (उदाहरण के लिए) में विपरीत (इन-ऑर्डर) लेआउट है।

5

आपको क्यों लगता है कि ट्यूपल का कार्यान्वयन क्या है? Program to an interface, not an implementation

यदि आप केवल अपने विज्ञापित इंटरफ़ेस के माध्यम से टुपल का उपयोग करते हैं, तो आप अपनी ऑब्जेक्ट्स को उसी क्रम में निकाल देंगे जो आप उन्हें डालते हैं। यदि आप इसके बजाय सीधे अपनी सामग्री तक पहुंच करके encapsulation तोड़ते हैं, उदाहरण के लिए आपके अंदर डोडी पॉइंटर कास्ट उदाहरण के लिए, तो सभी दांव बंद हैं।

+0

मैंने पहले ही कहा है कि - 'glInterleavedArrays() 'एक ऐसा फ़ंक्शन है जो एक इंटरलीव किए गए डेटा सरणी का अनुरोध करता है। मेरा इरादा एक ट्यूपल क्लास बनाना था जो इस सिद्धांत पर काम करेगा - ट्यूल्स की एक सरणी में डेटा को इंटरलेविंग करना ताकि मैं डेटा को जीएल में पास कर सकूं। यदि आप अधिक जानकारी चाहते हैं, तो OpenGL दस्तावेज़ देखें: http://www.opengl.org/sdk/docs/man/xhtml/glInterleavedArrays.xml –

+0

@RetroX: तो टुपल के कार्यान्वयन पर निर्भर होने के बजाय, आप एक ऑब्जेक्ट चाहते हैं जिसका इंटरफ़ेस किसी ज्ञात क्रम में क्रमबद्धरण का माध्यम प्रदान करता है। किसी भी तरह से, आप इंटरफ़ेस गारंटी प्रदान करना चाहते हैं, ताकि आप कार्यान्वयन विवरण से बंधे न हों। –

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