c++ - स्केलर `नया टी` बनाम सरणी` नया टी[1] `




new-operator (2)

हम हाल ही में खोज कर रहे हैं कि कुछ कोड new T[1] व्यवस्थित रूप से उपयोग कर रहे थे (ठीक से delete[] , और मैं सोच रहा था कि यह हानिरहित है, या उत्पन्न कोड में कुछ डाउनसाइड हैं (अंतरिक्ष या समय / प्रदर्शन में) । बेशक, यह फ़ंक्शन और मैक्रोज़ की परतों के पीछे छिपा हुआ था, लेकिन यह बिंदु के बगल में है।

तार्किक रूप से, यह मुझे प्रतीत होता है कि दोनों समान हैं, लेकिन क्या वे हैं?

क्या कंपाइलरों को इस कोड को चालू करने की अनुमति है (शाब्दिक 1 का उपयोग करते हुए, चर नहीं, लेकिन फ़ंक्शंस लेयर्स के माध्यम से, कि 1 इस तरह से new T[n] का उपयोग करके स्केलर new T में कोड तक पहुंचने से पहले 2 या 3 बार एक तर्क चर में बदल जाता है। ?

इन दोनों के अंतर के बारे में जानने के लिए कोई अन्य विचार / बातें?


नहीं, संकलक को new T[1] को new T से बदलने की अनुमति नहीं है। operator new और operator new[] (और संबंधित विलोपन) बदली जाने योग्य ([basic.stc.dynamic] / 2) हैं। उपयोगकर्ता-परिभाषित प्रतिस्थापन यह पता लगा सकता है कि किसे कहा जाता है, इसलिए जैसा कि नियम इस प्रतिस्थापन की अनुमति नहीं देता है।

नोट: यदि कंपाइलर यह पता लगा सकता है कि इन कार्यों को प्रतिस्थापित नहीं किया गया है, तो यह उस परिवर्तन को बना सकता है। लेकिन स्रोत कोड में ऐसा कुछ भी नहीं है जो इंगित करता है कि संकलक-आपूर्ति वाले कार्यों को प्रतिस्थापित किया जा रहा है। प्रतिस्थापन आमतौर पर लिंक समय पर किया जाता है, बस प्रतिस्थापन संस्करणों में लिंक करके (जो पुस्तकालय-आपूर्ति किए गए संस्करण को छिपाता है); आमतौर पर कंपाइलर को इसके बारे में जानने में बहुत देर हो जाती है।


नियम सरल है: delete[] new[] मेल खाना चाहिए new[] और new मेल खाना चाहिए: किसी भी अन्य संयोजन का उपयोग करने पर व्यवहार अपरिभाषित है।

कंपाइलर वास्तव में new T[1] को एक साधारण new T में बदलने की अनुमति देता है (और उचित रूप से delete[] के साथ delete[] दें), अगर-जैसा नियम है। मैं एक संकलक भर में नहीं आया हूँ जो यह करता है।

यदि आपके पास प्रदर्शन के बारे में कोई आरक्षण है, तो इसे प्रोफाइल करें।





new-operator