2012-05-14 15 views
51

एक बफर आवंटन है new char[sizeof(T)] के माध्यम से स्मृति जो ठीक से टाइप T, जहां उनके प्राकृतिक, कार्यान्वयन परिभाषित है T के सभी सदस्यों के लिए गठबंधन किया है आवंटित करने के लिए गारंटी, संरेखण (जो है, आप alignas कीवर्ड उनके संरेखण संशोधित करने के लिए इस्तेमाल नहीं किया है) ।क्या नया चार वास्तव में कक्षा के प्रकार के लिए गठबंधन स्मृति की गारंटी देता है?

मैंने इस गारंटी को यहां कुछ उत्तरों में देखा है लेकिन मैं पूरी तरह से स्पष्ट नहीं हूं कि मानक इस गारंटी पर कैसे आता है। मानक के 5.3.4-10 बुनियादी आवश्यकता देता है: अनिवार्य रूप से new char[] को max_align_t पर गठबंधन किया जाना चाहिए।

जो मुझे याद आ रहा है वह बिट है जो alignof(T)max_align_t के अधिकतम मूल्य के साथ हमेशा वैध संरेखण होगा। मेरा मतलब है, यह स्पष्ट प्रतीत होता है, लेकिन संरचना के परिणामी संरेखण को max_align_t पर होना चाहिए? यहां तक ​​कि 3.11-3 बिंदु बताता है कि विस्तारित संरेखण समर्थित हो सकते हैं, तो क्या संकलक अपने स्वयं के वर्ग पर निर्णय ले सकता है एक अति-संरेखित प्रकार है?

+5

अंत में, एक अच्छा सवाल है। क्या मैं कई बार गुच्छा कर सकता हूं? (क्लिक करें क्लिक करें) –

+2

@ जॉन डीबलिंग: अपने आप से, नहीं, लेकिन सौभाग्य से हमारे पास एक गुच्छा है: डी –

+4

कोई जवाब नहीं है, लेकिन क्या आप इसे सुरक्षित नहीं कर सकते हैं और 'नया टी'' का उपयोग नहीं कर सकते हैं और परिणाम डाला जा सकता है? ओह, और मुझे एक नया टैग सिखाने के लिए +1। मैंने भाषा-वकील के बारे में कभी नहीं सुना। –

उत्तर

6

मैं क्या याद कर रहा हूँ बिट जो कहते हैं alignof(T) हमेशा max_align_t की एक अधिकतम मूल्य के साथ एक मान्य संरेखण हो जाएगा। मेरा मतलब है, यह स्पष्ट प्रतीत होता है, लेकिन संरचना के परिणामी संरेखण को max_align_t पर होना चाहिए? यहां तक ​​कि 3.11-3 बिंदु बताता है कि विस्तारित संरेखण समर्थित हो सकते हैं, तो क्या संकलक अपने स्वयं के वर्ग पर निर्णय ले सकता है एक अति-संरेखित प्रकार है?

Mankarse द्वारा बताया गया है, सबसे अच्छा उद्धरण मैं मिल सकता से [basic.align]/3 है:

एक प्रकार एक विस्तारित संरेखण आवश्यकता होने एक से अधिक गठबंधन प्रकार है। [नोट: प्रत्येक अति-संरेखित प्रकार में एक वर्ग प्रकार है या जिसमें विस्तारित संरेखण लागू होता है (संभवतः एक गैर स्थैतिक डेटा सदस्य के माध्यम से)। अंत टिप्पणी]

जो सूचित करते हैं कि विस्तारित संरेखण स्पष्ट रूप से आवश्यक किया जाना चाहिए (और फिर से प्रसारित) लगता है, लेकिन नहीं कर सकते हैं

मैं होता एक स्पष्ट उल्लेख पसंद करते हैं; इरादे अभी भी एक संकलक-लेखक के लिए स्पष्ट है, और किसी भी अन्य व्यवहार पागल हो सकता है, ...

+0

यह _applied_ शब्द का उपयोग करता है, क्या एक कंपाइलर अपने विस्तारित संरेखण को अपने आप लागू कर सकता है? या पैराग्राफ में अंक 1/2 करते हैं ताकि यह संकेत दिया जा सके कि संकलक द्वारा लागू कोई भी संरेखण अधिकतम 'max_align_t' होना चाहिए? –

+0

@ edA-qamort-ora-y: ** [dcl.align]/1 ** क्रिया का भी उपयोग करता है: "एक संरेखण-विनिर्देशक लागू किया जा सकता है", इसलिए मैं * उम्मीद करता हूं कि इसका मतलब है कि यह है जहां लागू होते हैं और इसे स्पष्ट रूप से आवश्यक होना चाहिए लेकिन ... –

16

भाव new char[N] और new unsigned char[N] की गारंटी है स्मृति पर्याप्त किसी भी वस्तु के लिए गठबंधन वापस जाने के लिए। देखें §5.3.4/10 "[...] चार और हस्ताक्षरित चार के सरणी के लिए, के बीच अंतर नई अभिव्यक्ति के परिणाम और आवंटन फ़ंक्शन द्वारा दिए गए पते का सख्ती से एक अभिन्न अंग होगा किसी भी ऑब्जेक्ट प्रकार के मूल संरेखण आवश्यकता (3.11) जिसका आकार से अधिक सरणी के आकार की तुलना में अधिक नहीं है। [नोट: क्योंकि आवंटन फ़ंक्शंस को किसी भी प्रकार की ऑब्जेक्ट्स के लिए उचित रूप से गठबंधन करने के लिए पॉइंटर्स को वापस करने के लिए माना जाता है मौलिक संरेखण के साथ, सरणी आवंटन ओवरहेड पर यह बाधा वर्ण सरणी आवंटित करने के सामान्य मुहावरे को अनुमति देती है जिसमें अन्य प्रकारों की वस्तुओं को बाद में रखा जाएगा। -डे नोट] "।

एक स्टाइलिस्ट दृष्टिकोण से, निश्चित रूप से: यदि आप चाहते हैं कि कच्चे मेमोरी आवंटित करना है, तो यह कहना स्पष्ट है: operator new(N)।संकल्पनात्मक रूप से, new char[N]Nchar बनाता है; operator new(N)N बाइट आवंटित करता है।

+2

केवल 'max_align_t' तक, मौलिक संरेखण आवश्यकता के साथ एक प्रकार के लिए संरेखण प्रदान करना आवश्यक है। तो सवाल यह है कि क्या संकलक विस्तारित संरेखण के वर्ग प्रकार बना सकता है, जो इस प्रकार मूल रूप से गठबंधन नहीं किया जाएगा। –

+0

यह उत्तर क्या जोड़ता है? मानक उद्धरण प्रश्न में संदर्भित एक ही खंड है। –

+0

यह सही उत्तर है (+1) – Belloc

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