2013-05-13 8 views
8

मैं स्मृति आवंटित कर रहा हूं जिसे बाद में प्लेसमेंट new के साथ ऑब्जेक्ट्स बनाने के लिए उपयोग किया जाएगा। क्या मुझे operator new(n) का उपयोग करना चाहिए, या मुझे new unsigned char[n] का उपयोग करना चाहिए? क्यूं कर?ऑपरेटर नया (एन) बनाम नए हस्ताक्षरित चार [एन] प्लेसमेंट के लिए नया

+1

मुझे लगता है कि या तो ठीक होगा। –

+0

@sftrabbit: तो संरेखण, अर्थशास्त्र, प्रदर्शन, या ऐसा कुछ के मामले में कोई अंतर नहीं है? – Mehrdad

+0

@ मेहरदाद * "अर्थशास्त्र" * - वास्तव में अंतर है। –

उत्तर

7

कारक:

  • new[]delete
  • साथ delete[]/new() के साथ मिलान किया जाना चाहिए वे अलग बातें संवाद। operator new(n) अनिर्दिष्ट उद्देश्यों के लिए स्मृति का अनुरोध है, जबकि new unsigned char[n] स्पष्ट रूप से वहां वर्णों को संग्रहीत करने का इरादा है।

सरणी रूप हो सकता है थोड़ा खराब प्रदर्शन/दक्षता बुद्धिमान - अपने क्रियान्वयन के आधार पर सटीक विवरण:

5.3.4/12 नई टी [5] नई ऑपरेटर के एक कॉल में परिणाम जहां x एक गैर neagtive अनिर्दिष्ट मान सरणी आवंटन भूमि के ऊपर का प्रतिनिधित्व करता है: नई अभिव्यक्ति का परिणाम operator new[] ....

BTW द्वारा दिए गए मान से इस राशि की भरपाई हो जाएगा - न initialised कर रहे हैं:

  • operator new() रिटर्न uninitialised स्मृति करने के लिए एक void*: 3.7.4.1/2 देख "आवंटन समारोह से लौटने पर आवंटित संग्रहण की सामग्री को बगैर किसी अड़चन हैं", जबकि 5.3.4/15 कहते हैं, "एक नया -एक्सप्रेस जो प्रकार टी की ऑब्जेक्ट बनाता है, उस वस्तु को निम्नानुसार शुरू करता है: यदि नया-प्रारंभकर्ता कम हो जाता है, तो ऑब्जेक्ट डिफ़ॉल्ट-प्रारंभिक (8.5) "होता है; 8.5/6 कहता है कि केवल वर्ग प्रकार डिफ़ॉल्ट कन्स्ट्रक्टर प्रारंभिकरण प्रदान करते हैं।
5

पूर्व कुछ भंडारण क्षेत्र में एक सूचक लौटाता है। उत्तरार्द्ध इसमें कुछ ऑब्जेक्ट्स के साथ सरणी के पहले तत्व में एक सूचक लौटाता है। यदि आपको भंडारण की आवश्यकता है, तो उस उपकरण का उपयोग करें जो भंडारण देता है और वस्तुओं को नहीं देता है।

+0

क्या अंतर है? क्या वे दोनों अनियंत्रित नहीं हैं? या आप बस यह कह रहे हैं कि यह एक पठनीयता मुद्दा है? – Mehrdad

+1

@Elazar No. 'ऑब्जेक्ट नया [n] 'के साथ कोई ऑब्जेक्ट प्रारंभ नहीं हुआ है। 'नया हस्ताक्षरित चार [n]' डिफ़ॉल्ट- 'हस्ताक्षरित चार' की सरणी शुरू करता है (और 'हस्ताक्षरित चार' का डिफ़ॉल्ट प्रारंभ प्रारंभ नहीं करता है)। –

+0

@ एलिज़र: न तो आरंभ किया गया है - मेरे उत्तर में मानक संदर्भ प्रदान किए गए हैं। –

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