कुछ जांच के बाद, मैंने पाया कि सी ++ 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
जब तक यह भविष्य में उपलब्ध हो जाता है, मैं बहुत ज्यादा इस लागू करने के लिए एक और रास्ता खोजने पर अटक कर रहा हूँ। क्या कोई और तरीका है? जीसीसी को सही तरीके से आदेशित टुपल मेमोरी-वार प्राप्त करने के लिए कुछ तरीका है?
मैंने पहले ही कहा है कि - 'glInterleavedArrays() 'एक ऐसा फ़ंक्शन है जो एक इंटरलीव किए गए डेटा सरणी का अनुरोध करता है। मेरा इरादा एक ट्यूपल क्लास बनाना था जो इस सिद्धांत पर काम करेगा - ट्यूल्स की एक सरणी में डेटा को इंटरलेविंग करना ताकि मैं डेटा को जीएल में पास कर सकूं। यदि आप अधिक जानकारी चाहते हैं, तो OpenGL दस्तावेज़ देखें: http://www.opengl.org/sdk/docs/man/xhtml/glInterleavedArrays.xml –
@RetroX: तो टुपल के कार्यान्वयन पर निर्भर होने के बजाय, आप एक ऑब्जेक्ट चाहते हैं जिसका इंटरफ़ेस किसी ज्ञात क्रम में क्रमबद्धरण का माध्यम प्रदान करता है। किसी भी तरह से, आप इंटरफ़ेस गारंटी प्रदान करना चाहते हैं, ताकि आप कार्यान्वयन विवरण से बंधे न हों। –