2015-10-06 9 views
5

वर्तमान में, मानक पुस्तकालय में आवंटन कार्यों की तरह स्थिरांक संदर्भ द्वारा std::nothrow_t ले:क्यों आवंटन कार्य मूल्य के बजाय संदर्भ द्वारा std :: nothrow_t लेते हैं?

void* operator new (std::size_t count, const std::nothrow_t& tag); 
void* operator new[](std::size_t count, const std::nothrow_t& tag); 

std::nothrow_t के बाद से बस भेजने प्रयोजनों के लिए एक प्रकार का टैग है, हैं ना सरल और (संभवतः) अधिक से ले जाने के लिए कुशल मूल्य? उदाहरण के लिए:

void* operator new (std::size_t count, std::nothrow_t tag); 
void* operator new[](std::size_t count, std::nothrow_t tag); 

कॉन्स्ट संदर्भ डिजाइन के पीछे तर्क क्या है?

+1

शायद इसलिए कोई कॉपी कन्स्ट्रक्टर नहीं कहा जाना चाहिए। – CoffeeandCode

+1

@CoffeeandCode मुझे लगता है कि टैग प्रकारों की प्रतिलिपि तुच्छ और तेज़ है, और यह संकलक अनुकूलन के अधीन है। – Lingxi

+0

लेकिन उनके कार्यान्वयन से अक्सर किसी को इस प्रकार को तुरंत चालू करना मुश्किल हो जाता है। – CoffeeandCode

उत्तर

5

यदि new के इस संस्करण का सामान्य उपयोग इसे new(nothrow_t()) T के रूप में कॉल करना था, तो आपके पास एक अच्छा बिंदु होगा। लेकिन यह सामान्य उपयोग नहीं है, सामान्य उपयोग new(nothrow) T है, जहां nothrow को extern const std::nothrow_t nothrow; के रूप में घोषित किया गया है। हालांकि एक nothrow_t प्रकार में कोई वास्तविक डेटा नहीं है, यह अभी भी (कम से कम) एक बाइट तक ले जाता है, और कई कपड़े में है कि मतलब यह होगा कि कि (फिर से, कम से कम) एक बाइट में nothrow वस्तु से पढ़ा जा करने की आवश्यकता होगी इसे operator new पर पास करने का आदेश। इसे संदर्भ में लेना केवल वस्तु के पते को लोड करने की आवश्यकता है। तो नहीं, यदि प्रदर्शन अंतर बिल्कुल मापने योग्य है, तो मैं अपेक्षा करता हूं कि मूल्य-मान संस्करण यहां तेज़ हो।

+0

क्या आपके पास ऐसे एबीआई का उदाहरण है? उदा। मुझे पढ़ने के लिए विचित्र लग रहा है उदा। इसे कॉपी करने के लिए एक खाली संरचना एस, सिर्फ इसलिए कि आकार (एस) == 1. ऑप्टिमाइज़ेशन चालू होने पर और भी अधिक। –

+0

@ArneVogel सिर्फ 'sizeof (एस) == 1', लेकिन अगर' S' तुच्छता copyable है, जिसका अर्थ है कि नकल 'memcpy' के बराबर द्वारा किया जा सकता है, और एक ABI आसानी से है कि नकल * चाहिए निर्दिष्ट कर सकते हैं क्योंकि * 'memcpy' के बराबर किया जाना चाहिए। एक वास्तविक कार्यान्वयन के लिए, जब मैं अगर अपने ABI वास्तव में इस जनादेश पता नहीं है, MSVC वास्तव में एक खाली struct से पढ़ा अगर यह मान द्वारा पारित करने, भले ही अनुकूलन सक्षम होते हैं करता है। – hvd

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