c++ - :: ऑपरेटर नया क्यों है[] आवश्यक है जब:: ऑपरेटर नया पर्याप्त है?




memory-management overloading (4)

मानक (एन 3 9 36) यह स्पष्ट करता है कि ये दो ऑपरेटर अलग-अलग लेकिन संबंधित उद्देश्यों की सेवा करते हैं।

operator new फंक्शन void* operator new(std::size_t) कॉल करता है। पहला तर्क ऑपरेटर को तर्क के समान होना चाहिए। यह भंडारण के एक ब्लॉक को उपयुक्त रूप से गठबंधन करता है, और जो आवश्यक से कुछ हद तक बड़ा हो सकता है।

operator new[] फ़ंक्शन void* operator new[](std::size_t) कॉल करता है। सरणी अनुक्रमण के लिए आवश्यक अतिरिक्त संग्रहण स्थान प्रदान करने के लिए, पहला तर्क ऑपरेटर को दिए गए तर्क से बड़ा हो सकता है। दोनों के लिए डिफ़ॉल्ट कार्यान्वयन बस malloc () को कॉल करना है।

operator new[] का उद्देश्य operator new[] उपलब्ध है, यदि उपलब्ध हो तो विशेष सरणी अनुक्रमण का समर्थन करना है। इसमें मेमोरी पूल या कुछ और करने के लिए कुछ भी नहीं है। इस सुविधा के उपयोग के अनुरूप एक कार्यान्वयन कार्यान्वयन में, कार्यान्वयन अतिरिक्त स्थान में विशेष तालिकाओं को स्थापित करेगा और संकलक निर्देशों के लिए कोड उत्पन्न करेगा या लाइब्रेरी लाइब्रेरी समर्थन दिनचर्या को कॉल करेगा जो उन तालिकाओं का उपयोग करता है। एरे का उपयोग कर सी ++ कोड और नए [] का उपयोग करने में असफल होने से उन प्लेटफॉर्म पर असफल हो जाएगा।

मुझे इस तरह के किसी भी कार्यान्वयन के बारे में व्यक्तिगत रूप से पता नहीं है, लेकिन यह कुछ मेनफ्रेम (सीडीसी, आईबीएम, इत्यादि) के समर्थन के लिए आवश्यक सुविधाओं की तरह दिखता है, जिसमें इंटेल या आरआईएससी चिप्स के विपरीत एक आर्किटेक्चर है जो हम जानते हैं और प्यार करते हैं।

मेरी राय में, स्वीकृत उत्तर गलत है।

बस पूर्णता के लिए, मानक (एन 3 9 36 ज्यादातर एस 5.3.4 में) में निम्नलिखित शामिल हैं।

  1. 'सरणी ऑब्जेक्ट' या 'गैर-सरणी ऑब्जेक्ट' आवंटित करने के बीच एक अंतर
  2. 'सरणी आवंटन ओवरहेड' के संदर्भ, इस निहितार्थ के साथ कि अतिरिक्त संग्रहण की आवश्यकता हो सकती है और यह (किसी भी तरह) पुनरावृत्ति गणना या तत्व आकार के लिए उपयोग किया जा सकता है।

मेमोरी पूल या किसी भी संकेत का कोई संदर्भ नहीं है कि यह एक विचार हो सकता है।

जैसा कि हम जानते हैं, सी ++ मानक वैश्विक आवंटन कार्यों के दो रूपों को परिभाषित करता है:

void* operator new(size_t);
void* operator new[](size_t);

और, मसौदा सी ++ मानक (18.6.1.2 n3797) का मसौदा कहता है:

227) पुनरावृत्ति गणना या सरणी के तत्व आकार को नोट करने के लिए ऑपरेटर नई या ऑपरेटर डिलीट की सीधी ज़िम्मेदारी नहीं है। उन परिचालनों को सरणी में कहीं और किया जाता है और अभिव्यक्ति हटा दी जाती है। सरणी नई अभिव्यक्ति, पूरक जानकारी को स्टोर करने के लिए स्थान प्राप्त करने के लिए ऑपरेटर को आकार तर्क को बढ़ा सकती है।

मुझे भ्रमित करने वाला क्या है:

क्या होगा अगर हम void* operator new[](size_t); हटा दें void* operator new[](size_t); मानक से, और इसके बजाय void* operator new(size_t) उपयोग करें? एक अनावश्यक वैश्विक आवंटन समारोह को परिभाषित करने के लिए तर्क क्या है?


मुझे यकीन है कि वहां उचित उपयोग-मामले हैं जिनके लिए अलग-अलग new[] और new , लेकिन मुझे अभी तक कोई सामना नहीं हुआ है जो इस अलगाव के साथ विशिष्ट रूप से संभव नहीं है और कुछ भी नहीं।

हालांकि, मैं इसे इस तरह देखता हूं: चूंकि उपयोगकर्ता ऑपरेटर के new संस्करणों को new कॉल करता है, इसलिए सी ++ मानक जानबूझकर और जानबूझकर जानकारी खोने का दोषी होता अगर वे केवल एक operator new परिभाषित करते थे और दोनों new और new[] । यहां (शाब्दिक) जानकारी का एक बिट है, जो कि किसी के लिए उपयोगी हो सकता है , और मुझे नहीं लगता कि समिति के लोग इसे अच्छे विवेक में फेंक सकते थे!

इसके अलावा, अतिरिक्त new[] लागू करने के लिए new[] हमारे बाकी हिस्सों के लिए बहुत ही मामूली असुविधा है, अगर किसी भी जानकारी को संरक्षित करने का व्यापार एक छोटे से अंश में एक साधारण कार्य को लागू करने के खिलाफ जीतता है हमारे कार्यक्रमों का।


::operator new[] और ~ delete[] मेमोरी उपयोग डिबगिंग की सुविधा प्रदान करता है, ऑडिट आवंटन और डीलोकेशन ऑपरेशंस के लिए केंद्रीय बिंदु है; फिर आप सुनिश्चित कर सकते हैं कि सरणी का रूप दोनों या न तो दोनों के लिए उपयोग किया जाता है।

अत्यधिक असामान्य / कच्चे ट्यूनिंग का उपयोग करने पर भी बहुत सारे व्यावहारिक हैं:

  • एक अलग पूल से सरणी आवंटित करें, शायद इसलिए कि महत्वपूर्ण एकल कैश हिट छोटे एकल-ऑब्जेक्ट गतिशील रूप से आवंटित वस्तुओं के लिए हिट करता है,

  • सरणी / गैर-सरणी डेटा के लिए विभिन्न मेमोरी एक्सेस संकेत (एला madvise )

99.9 99% प्रोग्रामर की दिन-प्रति-दिन की चिंताओं के बारे में सब कुछ अजीब और बाहर है, लेकिन यह क्यों संभव है?


सी ++ प्रोग्रामिंग भाषा: विशेष संस्करण पी 423 कहता है

_ operator new() और operator delete() फ़ंक्शंस उपयोगकर्ता को आवंटन और अलग-अलग ऑब्जेक्ट्स को operator delete() अनुमति देता है; operator new[]() और operator delete[]() आवंटन और सरणी के आवंटन के लिए बिल्कुल वही भूमिका निभाते हैं।

इस नवाचार की मेरी गलतफहमी को सुधारने के लिए धन्यवाद टोनी डी।

वाह, अक्सर मैं सी ++ में कुछ पर पकड़ा नहीं जाता हूं, मैं इतना निश्चित हूं - मुझे उद्देश्य-सी में बहुत अधिक समय व्यतीत करना होगा!

मूल गलत जवाब

यह आसान है - नया [] फॉर्म क्लासिक सी सरणी के प्रत्येक तत्व पर निर्माता को आमंत्रित करता है

तो यह पहले सभी वस्तुओं के लिए जगह आवंटित करता है, फिर प्रत्येक स्लॉट के लिए कन्स्ट्रक्टर को कॉल करता है।





new-operator