2017-11-16 4 views
23

सी # 7.2 दो नए प्रकार पेश करता है: Span<T> और Memory<T> जो पहले सी # प्रकारों जैसे string[] पर बेहतर प्रदर्शन करते हैं।सी # 7.2 में स्पैन <T> और मेमोरी <T> के बीच क्या अंतर है?

प्रश्न: Span<T> और Memory<T> के बीच क्या अंतर है? मैं एक दूसरे पर क्यों इस्तेमाल करूंगा?

+3

यह भी देखें: [सी # 7.2: स्पैन समझना] (https://channel9.msdn.com/Events/Connect/2017/T125) –

+1

@JeffMercado क्या सी # प्रकारों की स्ट्रिंग के अलावा वे कहीं भी एक पूर्ण सूची है []? क्या वे केवल सरणी के लिए हैं या इन्हें सूची जैसे प्रकारों के बजाय भी इस्तेमाल किया जा सकता है? – user3610374

उत्तर

22

Span<T> स्टैक-केवल प्रकृति है जबकि Memory<T> ढेर का उपयोग कर सकते हैं।

Span<T> एक नए प्रकार हम मंच टी के साथ [] सममूल्य पर प्रदर्शन विशेषताओं के साथ मनमाना स्मृति के सटे क्षेत्रों, का प्रतिनिधित्व करने के लिए जोड़ रहे हैं है। इसकी एपीआई सरणी के समान हैं, लेकिन सरणी के विपरीत, यह या तो प्रबंधित या मूल मेमोरी, या को स्टैक पर आवंटित स्मृति के लिए इंगित कर सकता है।

Memory <T> एक प्रकार Span<T> पूरक है। जैसा कि इसके डिजाइन दस्तावेज़ में चर्चा की गई है, Span<T> एक स्टैक-केवल प्रकार है। Span<T> की स्टैक-केवल प्रकृति कई परिदृश्यों के लिए अनुपयुक्त बनाती है जिन्हें ढेर पर संदर्भों को संदर्भित करने की आवश्यकता होती है (Span<T> के साथ प्रतिनिधित्व) ढेर पर, उदा। के लिए एसिंक्रोनस कॉल करने के दिनचर्या।

async Task DoSomethingAsync(Span<byte> buffer) { 
    buffer[0] = 0; 
    await Something(); // Oops! The stack unwinds here, but the buffer below 
         // cannot survive the continuation. 
    buffer[0] = 1; 
} 

इस समस्या का समाधान करने के लिए, हम पूरक प्रकार का एक सेट प्रदान करेगा, का प्रतिनिधित्व सामान्य प्रयोजन विनिमय प्रकार, सिर्फ Span <T> की तरह, मनमाने ढंग से स्मृति की एक श्रृंखला के रूप में इस्तेमाल किया जा करने का इरादा है, लेकिन विपरीत Span <T> इन प्रकारों को स्मृति को पढ़ने और लिखने के लिए महत्वपूर्ण प्रदर्शन दंड की लागत पर केवल स्टैक-केवल नहीं होगा।

async Task DoSomethingAsync(Memory<byte> buffer) { 
    buffer.Span[0] = 0; 
    await Something(); // The stack unwinds here, but it's OK as Memory<T> is 
         // just like any other type. 
    buffer.Span[0] = 1; 
} 

ऊपर नमूने में, Memory <byte> बफर प्रतिनिधित्व करने के लिए प्रयोग किया जाता है। यह एक नियमित प्रकार है और एसिंक्रोनस कॉल करने के तरीके में उपयोग किया जा सकता है। इसकी अवधि संपत्ति Span<byte> लौटाती है, लेकिन लौटा मूल्य एसिंक्रोनस कॉल के दौरान ढेर पर संग्रहीत नहीं होता है, बल्कि नए मान Memory<T> मान से उत्पादित होते हैं। एक अर्थ में, Memory<T>Span<T> का एक कारखाना है।

संदर्भ दस्तावेज़: here

+1

"स्टैक-केवल प्रकृति" का क्या अर्थ है? – Enigmativity

+0

@ कोडिंग, यह सच नहीं है, यह प्रबंधित स्मृति (यानी सरणी) को भी इंगित कर सकता है। तथ्य यह है कि एक अवधि केवल ढेर में हो सकती है इसका मतलब यह नहीं है कि जिस स्मृति को इंगित करता है वह भी ढेर में होना आवश्यक है। –

+0

क्या आप उन डिज़ाइन दस्तावेज़ों के लिंक पोस्ट कर सकते हैं जिन्हें आप संदर्भित कर रहे हैं? –

10

पुन: इस यह केवल स्टैक पर आबंटित स्मृति को इंगित कर सकते हैं मतलब है।

Span<T> किसी भी स्मृति को इंगित कर सकता है: या तो ढेर या ढेर पर आवंटित। Span<T> की स्टैक-केवल प्रकृति का अर्थ है कि Span<T> स्वयं (जिस स्मृति को इंगित करता है) केवल स्टैक पर ही रह सकता है। यह "सामान्य" सी # structs के विपरीत है, जो ढेर या ढेर पर रहते हैं (जब वे कक्षाओं/संदर्भ-प्रकारों में एम्बेडेड होते हैं)।सबसे स्पष्ट व्यावहारिक प्रभाव यह है कि आपके पास कक्षा में Span<T> फ़ील्ड नहीं हो सकता है, आप Span<T> बॉक्स नहीं कर सकते हैं, और आप उन्हें सरणी के अंदर नहीं डाल सकते हैं।

+0

आह, उन लोगों में से एक है जैसे प्रकार के प्रकार। – IllidanS4

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