2011-12-15 25 views
16

मैं const ref और in के बीच अंतर को समझने की कोशिश कर रहा हूं, खासकर जब प्रदर्शन की बात आती है।'कॉन्स्ट रेफ' और 'इन' के बीच अंतर?

  1. मुझे पता है कि inconst scope के बराबर है, लेकिन the scope stor­age class means that ref­er­ences in the pa­ra­me­ter can­not be es­caped (e.g. as­signed to a global vari­able). क्या मतलब है? उदाहरण कोड स्वागत है।

  2. फ़ंक्शन को कार्यान्वित करते समय मैं const ref और in के बीच कैसे निर्णय ले सकता हूं? मुझे ref के साथ पता है कि ऑब्जेक्ट कॉपी नहीं किया गया है क्योंकि यह एक संदर्भ है, लेकिन in के साथ भी यही सच है?

उत्तर

10

1) scope पैरामीटर भंडारण वर्ग का मतलब है कि आप पैरामीटर के लिए एक संदर्भ से बचने के लिए अनुमति नहीं है। उदाहरण:

Object glob; 

struct S 
{ 
    Object o; 
    void foo(scope Object o) 
    { 
     this.o = o; // Not allowed! 'o' must not be escaped 
     glob = o; // ditto 
    } 
} 

ध्यान दें कि डीएमडी इसका पता लगाने में बहुत अच्छा नहीं है। उपर्युक्त उदाहरण वर्तमान में संकलित करता है, लेकिन इसकी अनुमति नहीं है।

scope प्रतिनिधि मापदंडों के लिए सबसे उपयोगी है:

void foo(scope void delegate() dg) 
{ 
    /* use dg */ 
} 

void main() 
{ 
    int i; 
    foo({ ++i; }); 
} 

उपरोक्त उदाहरण में, कोई बंद, अनाम समारोह भले ही यह एक upvalue है के लिए आवंटित किए जाने की जरूरत है क्योंकि foo "की गारंटी देता है" (यह है कंपाइलर का काम ...) कि प्रतिनिधि भाग नहीं गया है। डीएमडी वर्तमान में इस अनुकूलन को लागू करता है।

2) मुझे लगता है कि विचार यह है कि जब const और scope दोनों प्रयोग किया जाता है, संकलक सैद्धांतिक रूप से संदर्भ या मूल्य से होगा पर पास कर सकता है, जिसके कारण in शॉर्टकट उपयोगी है। डीएमडी अभी इस का लाभ नहीं लेता है, लेकिन फिर भी यह एक आसान शॉर्टकट है, और इसमें कुछ दस्तावेज मूल्य हैं।

संक्षेप में, in वर्तमान में आपको कोई प्रदर्शन नहीं मिलेगा जब तक कि यह किसी प्रतिनिधि पर उपयोग नहीं किया जाता है। ref आपको बड़े structs या स्थिर arrays के साथ कुछ प्रदर्शन प्राप्त कर सकते हैं। जब ref प्रदर्शन कारणों के लिए उपयोग किया जाता है, const अक्सर दस्तावेज़ (और लागू करने) के लिए उपयोग किया जाता है कि ref मूल मान को अपडेट करने के लिए उपयोग नहीं किया जाता है।

+0

1. अच्छा, कि बताता है कि क्यों मैं प्रभाव पुन: पेश करने में सक्षम नहीं था। 2. तो, क्या आप कह रहे हैं कि यदि किसी फ़ंक्शन के पैरामीटर में 'स्टोरेज क्लास' है, तो इसकी प्रतिलिपि बनाई जाती है? क्या मुझे 'कॉन्स्ट रेफरी' का उपयोग करना चाहिए? – Arlen

+0

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

+0

आप डीएमडी के बारे में इतना कैसे जानते हैं? क्या आप कोर-देवों में से एक हैं? – Arlen

10
  1. फ़ंक्शन से बचने के लिए scope पैरामीटर के लिए यह कानूनी नहीं है। कंपाइलर को यह गारंटी देना चाहिए कि उस डेटा के कोई संदर्भ फ़ंक्शन से बचें। इसका मुख्य रूप से प्रतिनिधियों के साथ उपयोग किया जाता है, क्योंकि यह संकलक को बंद करने से बचने की अनुमति देता है, क्योंकि यह जानता है कि प्रतिनिधि भाग नहीं पाएगा।

  2. const refconst है - बस in की तरह होगा - लेकिन परिवर्तनीय प्रतिलिपि के बजाय संदर्भ द्वारा पारित किया गया है, इसलिए आप एक प्रति से बचें। हालांकि, सी ++const ref के विपरीत रैल्यू के साथ काम करता है। यह एक लवली दिया जाना चाहिए। इसलिए, यदि आप const ref होने के लिए पैरामीटर घोषित करते हैं, तो यह उसमें सीमित होगा जो आप इसे पारित कर सकते हैं। आपको आमतौर पर इसे पास करने के लिए एक चर घोषित करना होगा, जबकि in एक अस्थायी स्वीकार करेगा।

    void func(const ref int var) {} 
    int a; 
    func(a); //legal 
    func(7); //illegal 
    

उन कॉल के दोनों अगर funcconst या in ले लिया कानूनी होगा। इसलिए, सामान्य रूप से, सवाल यह नहीं है कि आपको const ref या in का उपयोग करना चाहिए या नहीं। सवाल यह है कि आपको const या in का उपयोग करना चाहिए। और उस स्थिति में, सवाल यह है कि क्या आप scope का उपयोग करना चाहते हैं या नहीं, क्योंकि वे const दोनों हैं। और तुम scope उपयोग करें यदि आप यह सुनिश्चित करें कि चर के लिए कोई संदर्भ है कि आप में से गुजरती हैं कि समारोह बच जाएंगे चाहते हैं, तो यह आम तौर पर केवल प्रतिनिधियों के साथ प्रयोग किया जाता है लेकिन वर्ग या सरणियों के साथ उपयोगी हो सकता है।

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

तो, scope आम तौर पर केवल प्रतिनिधियों के साथ उपयोग की है, लेकिन इस अवसर पर वर्ग या सरणियों के साथ उपयोगी है। यह पहले से ही आम तौर पर कार्यों के लिए pure होने के लिए बेहतर है, ताकि अधिकांश मुद्दों का ख्याल रखा जा सके। जैसे, जबकि यह in उपयोग करने के लिए चोट नहीं करता है, वहां अक्सर in बजाय const का उपयोग करने में थोड़ा बात है। और आप आम तौर पर केवल const ref का उपयोग करते हैं यदि आप वास्तव में पारित होने वाले चर की प्रतिलिपि से बचना चाहते हैं, क्योंकि अन्यथा आप केवल उस फ़ंक्शन को अंतराल पास कर सकते हैं। आप एक समारोह को ओवरलोड कर सकते हैं यह संस्करण है जो const और एक जो const ref लेता है, लेकिन है कि स्पष्ट रूप से, कोड दोहराव में परिणाम है तो जब तक आप वास्तव में चाहते हैं const ref, यह शायद सिर्फ सबसे अच्छा const उपयोग करने के लिए ले जाता है है ऐसा है कि।

संपादित करें: बीमार की सलाह दी

scope अभी तक प्रतिनिधियों के अलावा और कुछ (2013-06-18) के रूप में के लिए लागू किया जाना है, ताकि प्रतिनिधियों के अलावा और कुछ के साथ या तो scope या in उपयोग कर रहा है। फिलहाल, वे भ्रामक हैं, और यदि/एक बार scope प्रतिनिधियों के अलावा और कुछ के लिए लागू किया गया है, वहाँ एक उच्च जोखिम है कि अपने कोड चर scope या in बचने के साथ चिह्नित के लिए संदर्भ की वजह से टूट जाएगा है।

+0

क्या यह सच नहीं है कि 'इन' काफी काम नहीं करता है क्योंकि इसे 'डीएमडी' में पूरी तरह लागू नहीं किया गया है? एक बार 'स्कोप' उन लोगों के लिए पूरी तरह लागू हो जाने के बाद यह एक तोड़ने वाला बदलाव नहीं होगा जिन्होंने गलत तरीके से 'इन' का उपयोग किया है? – Arlen

+0

मान लीजिए कि 'स्कोप' बग्गी है (और यह बहुत अच्छा हो सकता है; मैं इसका अधिक उपयोग नहीं करता, इसलिए मुझे इसकी वर्तमान स्थिति का बिल्कुल यकीन नहीं है), फिर हां, यह किसी भी कोड के लिए एक तोड़ने वाला बदलाव होगा 'स्कोप' या 'गलत' में इस्तेमाल किया गया है, लेकिन यह किसी भी कंपाइलर बग के साथ समान है। सौभाग्य से, जीएमबी में जाने के बाद विकास की तेज गति के कारण डीएमडी में ऐसे मुद्दों की संख्या काफी कम हो रही है, लेकिन निश्चित रूप से उन मुद्दों पर चलना अभी भी संभव है जहां एक सुविधा सही ढंग से लागू नहीं की गई है। –

+0

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

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