2010-12-29 23 views
5

का आवंटन लक्ष्य मैं TR1 अतिरिक्त के आसपास अपना सिर प्राप्त करने की कोशिश कर रहा हूं जिसे aligned_storage के नाम से जाना जाता है। निम्नलिखित दस्तावेजों को पढ़ने के दौरान N2165, N3190 और N2140 मैं अपने जीवन के लिए एक बयान नहीं देख सकता जहां यह स्पष्ट रूप से उपयोग की जाने वाली स्मृति की ढेर या ढेर प्रकृति का वर्णन करता है।std :: aligned_storage (स्टैक या ढेर?)

मैंने msvc2010, बूस्ट और जीसीसी द्वारा प्रदान किए गए कार्यान्वयन पर एक नज़र डाली है, वे सभी एक संघ के उपयोग के आसपास केंद्रित एक स्टैक आधारित समाधान प्रदान करते हैं।

संक्षेप में:

  • स्मृति प्रकार (ढेर या ढेर) aligned_storage कार्यान्वयन द्वारा इस्तेमाल किया परिभाषित या यह हमेशा आधारित ढेर करने के लिए है है?

  • और, विशिष्ट दस्तावेज़ क्या है जो परिभाषित करता है/निर्धारित करता है?

नोट:

template<class _Ty, size_t _Len> 
union _Align_type 
{ 
    // union with size _Len bytes and alignment of _Ty 
    _Ty _Val; 
    char _Pad[_Len]; 
}; 
: MSVC10 में, निम्न aligned_storage के प्रकार की परिभाषा, इस मामले में अगर aligned_storage एक ऑटो चर डेटा (_Val, _Pad) स्टैक पर बनाया जाता है है

नोट: यह एक मामूली सवाल नहीं है। उत्तर पोस्ट करने से पहले कृपया प्रश्न को आजमाएं और समझें।

उत्तर

12

std::aligned_storage<Len, Align> बस एक सदस्य typedef (type) घोषित करता है।

सदस्य type typedef एक पॉड किसी भी वस्तु जिसका आकार सबसे Len पर है और जिसका संरेखण के लिए अप्रारंभीकृत भंडारण के रूप में उपयोग के लिए उपयुक्त प्रकार होगा Align

का एक भाजक (यह नवीनतम से है सी ++ 0 एक्स ड्राफ्ट, एन 3225, 20.7.6.6 तालिका 53, लेकिन टीआर 1 विनिर्देशन, एन 1836 में भाषा प्रभावी रूप से वही है, सिवाय इसके कि सी ++ 0x Align टेम्पलेट पैरामीटर में अधिकतम संरेखण मान के रूप में डिफ़ॉल्ट तर्क है।)

std::aligned_storage कोई भी स्मृति आवंटित नहीं करता है। आप std::aligned_storage<Len, Align>::type प्रकार का ऑब्जेक्ट बना सकते हैं और उस ऑब्जेक्ट को उपरोक्त वर्णित आवश्यकताओं को पूरा करने वाले किसी भी प्रकार की ऑब्जेक्ट के रूप में दोबारा परिभाषित कर सकते हैं।

+2

मुझे यकीन नहीं है कि इसका उत्तर इससे बेहतर हो सकता है। डेटा टाइप गतिशील रूप से 'टाइप' में आवंटित किया गया था तो क्या होगा? संरेखण के संबंध में यह संभवतः किसी भी मदद से कैसे हो सकता है? – icecrime

+2

@ जेनिकोडर - बस मानक से उद्धरण पढ़ें। और फिर, यदि आवश्यक हो। :) 'std :: aligned_storage <...> :: टाइप' अनुरोधित संरेखण के साथ एक पीओडी प्रकार परिभाषित करता है। आप इस प्रकार के ढेर या ढेर में भंडारण आवंटित कर सकते हैं, यह प्रासंगिक नहीं है। – atzz

+0

@ जेनिकोडर - यह कार्यान्वयन-परिभाषित नहीं है। यह उपयोगकर्ता परिभाषित है। जेम्स द्वारा उद्धृत बयान सबकुछ स्पष्ट रूप से पर्याप्त बताता है। – atzz

0

किसी भी आवंटन (new/malloc) के बाद आपको आमतौर पर ढेर पर सामान संरेखित करने की आवश्यकता नहीं है) किसी भी प्रकार से गठबंधन किए गए पते पर स्मृति लौटाता है।

+3

यह बिल्कुल सही नहीं है। यदि आप सिमड निर्देश का उपयोग करते हैं, तो आपको कभी-कभी 16 बाइट सीमाओं को संरेखित करने की आवश्यकता होती है, जबकि नया/मॉलोक ऐसी वारंटी प्रदान नहीं करता है। उदाहरण के लिए, libc malloc वापसी स्मृति 8 बाइट सीमा पर गठबंधन। विंडोज पर लिनक्स या '_aligned_malloc' पर' posix_memalign' फ़ंक्शन देखें। –

+1

मैं केवल std :: align का उपयोग करके ढेर पर गठबंधन स्मृति आवंटित करने में सक्षम था, जो अभी तक gcc4.8 में नहीं है, इसलिए मैं इस कार्यान्वयन का उपयोग करता हूं: http://code.google.com/p/c-plus/source /browse/src/util.h#57 –

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