2016-09-09 11 views
29

सी ++ 17 विनिर्देश construct और destroystd::allocator ऑब्जेक्ट के सदस्यों को हटा देता है। कार्यकारी समूह ने अन्य सदस्य कार्यों here को "std :: आवंटक के अनावश्यक सदस्यों को कम करने" शीर्षक के तहत, अन्य सदस्य कार्यों को बहिष्कृत करने के लिए तर्क प्रदान किया।क्यों std :: आवंटक का निर्माण और C++ 17 में बहिष्कृत कार्यों को नष्ट कर रहे हैं?

हालांकि वे विशेष रूप से उल्लेख नहीं करते हैं कि उन दो सदस्यों को बहिष्कृत क्यों किया गया है या उस कार्यक्षमता को बदलने के लिए सिफारिश क्या है। मुझे लगता है कि निहितार्थ इसके बजाय std::allocator_traits::construct का उपयोग करना है।

मैं थोड़ा के बारे में है कि क्या लागू करने construct वास्तव में अभी भी कुछ मामलों में आवश्यक हो सकता है संदेह में हूँ हालांकि वजह से this comment about std::allocator_traits::construct

क्योंकि इस समारोह स्वत: गिरावट वापस नियुक्ति नया करने के लिए प्रदान करता है, सदस्य समारोह निर्माण() सी ++ 11 के बाद से एक वैकल्पिक आवंटक आवश्यकता है।

(memalign का उपयोग कर जैसे पेज गठबंधन स्मृति के लिए) कस्टम allocators के लिए, प्लेसमेंट new पर वापस गिरने जाएगा हमेशा सही व्यवहार का उत्पादन?

उत्तर

15

allocator requirements table कहता है कि construct(c, args), यदि प्रदान किया गया है, तो पर "ऑब्जेक्ट का निर्माण करना चाहिए"।

यह बिल्कुल कुछ भी नहीं कहता है 1) C के कन्स्ट्रक्टर या 2) के लिए कौन से तर्क पारित किए जाने हैं, ये तर्क कैसे पारित किए जाने हैं। यही कारण है कि संभाजक की पसंद है, और वास्तव में मानक में दो allocators उन्हें C के निर्माता को पार करने से पहले तर्क के साथ गड़बड़ करते हैं: std::scoped_allocator_adaptor और std::pmr::polymorphic_allocatorstd::pair का निर्माण करते समय, विशेष रूप से, वे pair के कन्स्ट्रक्टर तक पहुंचने वाले तर्कों को उनके द्वारा प्राप्त किए गए लोगों के समान नहीं हो सकते हैं।

कोई आवश्यकता है, या तो करने के लिए पूरी तरह से आगे है, एक सी ++ 03-शैली construct(T*, const T&) अक्षम होने पर अनुरूप है।

std::allocator के construct और destroy पदावनत कर रहे हैं क्योंकि वे बेकार हैं: अच्छा नहीं सी ++ 11 और बाद में कोड कभी उन्हें सीधे फोन करना चाहिए, और वे डिफ़ॉल्ट से अधिक कुछ भी नहीं जोड़ें।


हैंडलिंग स्मृति संरेखण constructallocate का कार्य, नहीं होना चाहिए।

7

फ़ंक्शन D0174R0 Deprecating Vestigial Library Parts in C++17 से अन्य लोगों के साथ फ़ंक्शंस हटा दिए गए थे। अगर हम प्रासंगिक अनुभाग को देखें जिसे हम

एसटीडी के कई सदस्यों :: संभाजक प्रचुरता से व्यवहार कर रहा है कि अन्यथा std::allocator_traits<allocator<T>> द्वारा उत्पादित नकल है, और सुरक्षित रूप से इस वर्ग को आसान बनाने से हटाया जा सकता है। इसके अलावा, एक नि: शुल्क फ़ंक्शन के रूप में संबोधित std::allocator<T>::address को सही करता है जिसके लिए सही प्रकार के आवंटक वस्तु की आवश्यकता होती है। अंत में, संदर्भ प्रकार उपनामों को प्रारंभ में अन्य आवंटकों के साथ विस्तार के लिए अपेक्षित साधन के रूप में प्रदान किया गया था, लेकिन जब हम आवंटन आवश्यकताओं (17.6.3.5 [allocator.requirements]) निर्दिष्ट करते हैं तो उपयोगी उद्देश्य प्रदान नहीं करते हैं।

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

जोर मेरा

तो तर्कसंगत था हम संभाजक में कोड के सभी नकल करने के बाद से हम संभाजक लक्षण है की जरूरत नहीं है। अगर हम std::allocator_traits को देखो हम इसे

allocate 
deallocate 
construct 
destroy 
max_size 

स्थिर कार्यों इसलिए हम संभाजक में लोगों के बजाय उन का उपयोग कर सकते है कि देखेंगे।

+0

हाँ मैं बहुत ज्यादा सवाल में जितना कहा। –

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