2010-11-26 32 views
13

क्या सी # कंपाइलर या .NET CLR स्ट्रिंग अक्षर/स्थिरांक का कोई चालाक स्मृति अनुकूलन करता है? मैं कसम खाता हूं कि मैंने "स्ट्रिंग आंतरिककरण" की अवधारणा के बारे में सुना होगा ताकि प्रोग्राम में कोड के किसी भी दो बिट्स में, शाब्दिक "यह एक स्ट्रिंग" वास्तव में उसी वस्तु को संदर्भित करेगी (संभावित रूप से सुरक्षित, तारों के साथ क्या अपरिवर्तनीय?)। मुझे Google पर इसके लिए कोई उपयोगी संदर्भ नहीं मिल रहा है ...सी # स्ट्रिंग अक्षर को संकलक द्वारा अनुकूलित किया जाता है?

क्या मैंने यह गलत सुना है? चिंता न करें - मैं इस जानकारी के साथ अपने कोड में कुछ भी भयानक नहीं कर रहा हूं, बस यह समझने के लिए बेहतर है कि यह कवर के तहत कैसे काम करता है।

+0

संबंधित http://stackoverflow.com/q/372547/38206 –

उत्तर

17

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


यह सिर्फ स्ट्रिंग अक्षर नहीं है। यह कोई स्ट्रिंग स्थिर है।उदाहरण के लिए तो, पर विचार करें:

public const string X = "X"; 
public const string Y = "Y"; 
public const string XY = "XY"; 

void Foo() 
{ 
    string z = X + Y; 
} 

संकलक पता चलता है कि संयोजन यहाँ (z के लिए) दो लगातार तार के बीच है, और इसलिए परिणाम भी एक निरंतर स्ट्रिंग है। इसलिए z का प्रारंभिक मान XY के मान के समान संदर्भ होगा, क्योंकि वे एक ही मान के साथ संकलित-समय स्थिरांक हैं।

संपादित करें: मैड्स और एरिक के जवाब ने सुझाव दिया कि माइक्रोसॉफ्ट सी # कंपाइलर स्ट्रिंग स्थिरांक और स्ट्रिंग अक्षर आमतौर पर उसी तरह से व्यवहार किया जाता है - लेकिन अन्य कार्यान्वयन भिन्न हो सकते हैं।

+0

विभिन्न असेंबली में दो समान स्ट्रिंग स्थिरांक एक ही ऑब्जेक्ट को इंगित करते हैं?/जिटर इंटर्न स्ट्रिंग अक्षर क्या है? – CodesInChaos

+0

@CodeInChaos: मेरा मानना ​​है कि 'संकलन रिलेक्सेशंस एट्रिब्यूट (संकलन रिलेक्सेशंस.स्ट्रिंगिंग इंटरनेशनल)' विशेषता पर निर्भर करता है। हालांकि मैं निश्चित रूप से कहना नहीं चाहूंगा। –

+0

हाय @ जोन्सकेट, कृपया सलाह दें कि एक ही सामग्री के साथ आंतरिक तारों का हमेशा एक ही संदर्भ होता है? क्या इसका मतलब यह है कि इस तरह के तारों के संदर्भों की तुलना करना सच हो जाएगा? –

6

This article स्ट्रिंग इंटर्निंग को अच्छी तरह से समझाता है। उद्धरण:

.NET में "इंटर्न पूल" की अवधारणा है। यह मूल रूप से केवल तारों का एक सेट है, लेकिन यह सुनिश्चित करता है कि प्रत्येक समय आप उसी स्ट्रिंग शाब्दिक संदर्भित करते हैं, तो आपको समान स्ट्रिंग का संदर्भ मिलता है। यह शायद भाषा-निर्भर है, लेकिन यह निश्चित रूप से सी # और वीबीएनईटी में सच है, और मैं बहुत एक ऐसी भाषा देखने के लिए आश्चर्यचकित हूं जो पर नहीं है, क्योंकि आईएल करना बहुत आसान बनाता है (शायद इंटर्न लिटरल्स में विफल होने से अधिक आसान)। साथ ही शाब्दिक स्वचालित रूप से प्रशिक्षु किया जा रहा है, तो आप प्रशिक्षु तार नजरबंद विधि के साथ मैन्युअल रूप से, और जांच कर सकते हैं कि क्या है या वहाँ पहले से ही है नहीं IsInterned विधि का उपयोग कर पूल में एक ही चरित्र अनुक्रम के साथ एक प्रशिक्षु स्ट्रिंग। यह कुछ हद तक एक बूलियन की तुलना में अनजाने में स्ट्रिंग देता है - यदि पूल में एक समान स्ट्रिंग है, तो स्ट्रिंग का संदर्भ वापस कर दिया गया है। अन्यथा, शून्य लौटा है। इसी तरह, प्रशिक्षु विधि एक प्रशिक्षु स्ट्रिंग के लिए एक संदर्भ रिटर्न - या तो स्ट्रिंग आप अगर पूल, या एक नव निर्मित प्रशिक्षु स्ट्रिंग, या एक बराबर स्ट्रिंग जो पूल में पहले से ही था पहले से ही था में पारित कर दिया।

+1

सिडेनोट: चूंकि इंटरेन्ड स्ट्रिंग को ऐपडॉमेन के लाइव-टाइम के दौरान मुक्त नहीं किया जाता है, इसलिए इंटरिंग के अनुचित उपयोग से स्मृति रिसाव हो सकता है। – CodesInChaos

7

हां यह स्ट्रिंग अक्षर को अनुकूलित करता है। एक सरल उदाहरण है जहाँ आप देख सकते हैं कि:

string s1="A"; 
string s2="A"; 
object.ReferenceEquals(s1,s2); //true 
संबंधित मुद्दे