Swift Academy · पाठ

असुरक्षित बफ़र पॉइंटर

सन्निहित मेमोरी को कुशलता से प्रोसेस कीजिए।

पाठ 3, कुल 4 में से13 चरण

असुरक्षित बफ़र पॉइंटर, CoddyKit पर Swift Academy का एक निःशुल्क पाठ है। यह 4 में से 3वाँ पाठ है। इस अध्ययन पथ के 3 तक कोई भी पाठ पूरा पढ़ना निःशुल्क है — इसके बाद CoddyKit PRO हर पाठ अनलॉक करता है, साथ ही अंतर्निर्मित कोड संपादक और चौबीसों घंटे एआई शिक्षक के साथ व्यावहारिक अभ्यास भी उपलब्ध कराता है। यह Swift Academy सीखने के मार्ग का हिस्सा है और आपकी प्रगति वेब तथा CoddyKit ऐप पर सिंक होती रहती है। Swift Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।

Buffer पॉइंटर क्या होता है

एक टाइप किया हुआ पॉइंटर एक समय में एक ही तत्व का पता देता है। UnsafeBufferPointer<T> एक आरंभिक पॉइंटर और count को लपेटता है और आपको Collection के अनुरूप, सन्निहित मेमोरी के एक ब्लॉक का सीमाबद्ध दृश्य देता है।

इसका मतलब है कि आप क्रम से पढ़ सकते हैं, सबस्क्रिप्ट से पहुँच सकते हैं, मानचित्रण कर सकते हैं और reduce कर सकते हैं—raw मेमोरी पर संग्रह के सभी परिचित API का उपयोग कर सकते हैं।

// A buffer pointer = base address + element count
// UnsafeBufferPointer<Int>(start: ptr, count: 5)

केवल-पठन और परिवर्तनशील buffer

एकल पॉइंटर की तरह, buffer भी दो प्रकार के होते हैं: केवल-पठन के लिए UnsafeBufferPointer<T>, और जब आपको तत्वों को मान भी देना हो तब UnsafeMutableBufferPointer<T>।

let p = UnsafeMutablePointer<Int>.allocate(capacity: 4)
p.initialize(repeating: 0, count: 4)
let buf = UnsafeMutableBufferPointer(start: p, count: 4)
buf[0] = 11
print(buf[0]) // 11

संग्रह की तरह क्रम से पढ़ना

क्योंकि buffer पॉइंटर एक Collection है, इसलिए for लूप हर तत्व पर क्रम से चलता है। लूप के भीतर इंडेक्स की हाथ से गणना नहीं करनी पड़ती और एक-की-त्रुटि का जोखिम नहीं रहता—हालाँकि आपके द्वारा दी गई सीमाओं की ज़िम्मेदारी अब भी आपकी है।

let buf = UnsafeMutableBufferPointer<Int>.allocate(capacity: 3)
_ = buf.initialize(from: [10, 20, 30])
for value in buf { print(value) } // 10, 20, 30

संग्रह के एल्गोरिदम बिना अतिरिक्त लागत के

map, filter, reduce, enumerated और indices सभी buffer पॉइंटर पर काम करते हैं। इससे आप उच्च-स्तरीय कोड के साथ raw मेमोरी को संसाधित कर सकते हैं और अतिरिक्त आवंटन से बच सकते हैं।

let buf = UnsafeMutableBufferPointer<Int>.allocate(capacity: 4)
_ = buf.initialize(from: [1, 2, 3, 4])
let total = buf.reduce(0, +)   // 10
let evens = buf.filter { $0 % 2 == 0 } // [2, 4]
print(total, evens)

परिवर्तनशील buffer का आवंटन

UnsafeMutableBufferPointer<T>.allocate(capacity:) मेमोरी के ब्लॉक के लिए स्थान आरक्षित करता है और एक ही चरण में buffer लौटाता है। पढ़ने से पहले आपको अब भी initialize करना होगा और काम पूरा होने पर deallocate करना होगा।

let buf = UnsafeMutableBufferPointer<Int>.allocate(capacity: 5)
buf.initialize(repeating: 0)
defer {
    buf.deinitialize()
    buf.deallocate()
}

सीमा पर जाँच नहीं होती

0..<count के भीतर सबस्क्रिप्ट से पहुँच बनाना ठीक है। लेकिन buffer यह नहीं जान सकता कि आपके द्वारा दिया गया count सही था या नहीं। यदि आप वास्तविक आवंटन से बड़े count के साथ buffer बनाते हैं, तो पठन अंत से बाहर जाकर अपरिभाषित मेमोरी तक पहुँचता है।

count हमेशा उसी आवंटन से निकालें जिसे आपने बनाया है।

let p = UnsafeMutablePointer<Int>.allocate(capacity: 3)
p.initialize(repeating: 0, count: 3)
// CORRECT: count matches capacity
let good = UnsafeBufferPointer(start: p, count: 3)
// WRONG: count: 10 would read past the block
print(good.count)

खाली buffer

count: 0 वाला buffer मान्य होता है और उसका nil base पता हो सकता है। isEmpty की जाँच करें या इस बात पर निर्भर रहें कि लूप चलेगा ही नहीं; baseAddress को बलपूर्वक अनरैप न करें।

let empty = UnsafeBufferPointer<Int>(start: nil, count: 0)
print(empty.isEmpty)       // true
print(empty.count)         // 0
for _ in empty { print("never runs") }

ऐरे पर withUnsafeBufferPointer

buffer प्राप्त करने का सबसे सुरक्षित तरीका मौजूदा Array से withUnsafeBufferPointer के माध्यम से प्राप्त करना है। Swift गारंटी देता है कि स्टोरेज सन्निहित और क्लोज़र की अवधि तक मान्य रहेगा, इसलिए आपको हाथ से आवंटन करने की आवश्यकता नहीं पड़ती।

let numbers = [4, 8, 15, 16, 23]
let maxValue = numbers.withUnsafeBufferPointer { buf -> Int in
    var m = buf[0]
    for v in buf where v > m { m = v }
    return m
}
print(maxValue) // 23

ऐरे के स्टोरेज में बदलाव

withUnsafeMutableBufferPointer आपको ऐरे के स्टोरेज में सीधे लिखने देता है। इसका उपयोग कभी-कभी प्रदर्शन-संवेदनशील, उसी स्थान पर किए जाने वाले रूपांतरणों में किया जाता है, जहाँ ARC और सीमा-जाँच अतिरिक्त लागत जोड़ सकते हैं।

var data = [1, 2, 3, 4]
data.withUnsafeMutableBufferPointer { buf in
    for i in buf.indices { buf[i] *= 10 }
}
print(data) // [10, 20, 30, 40]

C API के लिए baseAddress

जब किसी ऐसे C फ़ंक्शन को कॉल करें जो पॉइंटर और लंबाई की अपेक्षा करता है, तो buffer.baseAddress और buffer.count पास करें। आधार पता केवल खाली buffer के लिए nil होता है, इसलिए उस स्थिति को संभालें।

let bytes: [UInt8] = [0xDE, 0xAD, 0xBE, 0xEF]
bytes.withUnsafeBufferPointer { buf in
    if let base = buf.baseAddress {
        // c_function(base, buf.count)
        print("start:", base, "len:", buf.count)
    }
}

Buffer पॉइंटर का उपयोग कब करें

जब आपको मेमोरी के किसी क्षेत्र तक सन्निहित, प्रकार-सुरक्षित और संग्रह-जैसी पहुँच चाहिए, तब buffer पॉइंटर का उपयोग करें: C ऐरे को जोड़ने, बाइनरी फ़ॉर्मैट पार्स करने या बार-बार चलने वाले लूप में अतिरिक्त लागत घटाने के लिए। जहाँ संभव हो, हाथ से आवंटन करने के बजाय with... वाले क्लोज़र रूपों को प्राथमिकता दें।

// Counting set bits across a byte buffer
let data: [UInt8] = [0b1011, 0b0110, 0b1111]
let bits = data.withUnsafeBufferPointer { buf in
    buf.reduce(0) { $0 + $1.nonzeroBitCount }
}
print(bits) // 3 + 2 + 4 = 9

त्वरित जाँच

याद करें कि एकल पॉइंटर की तुलना में buffer पॉइंटर क्या अतिरिक्त सुविधा देता है।

पुनरावलोकन

Buffer पॉइंटर एक सन्निहित क्षेत्र को सीमाबद्ध संग्रह के रूप में लपेटते हैं:

  • UnsafeBufferPointer / UnsafeMutableBufferPointer = आधार पता + count।
  • आपको raw मेमोरी पर map, filter, reduce और for के माध्यम से क्रमिक पहुँच मिलती है।
  • ऐरे पर withUnsafeBufferPointer को प्राथमिकता दें, ताकि Swift मान्यता और lifetime का प्रबंधन कर सके।
  • दिया गया count विश्वसनीय माना जाता है—इसे वास्तविक आवंटन से निकालें।
शुरुआत निःशुल्क

एआई शिक्षक के साथ Swift सीखें — निःशुल्क

अपने ब्राउज़र में वास्तविक कोड लिखें और चलाएँ, चौबीसों घंटे एआई शिक्षक से तुरंत सहायता पाएँ, और वेब या ऐप पर वहीं से शुरू करें जहाँ आपने छोड़ा था।

पाठ्यक्रम
122
पाठ
409

अक्सर पूछे जाने वाले प्रश्न

क्या “असुरक्षित बफ़र पॉइंटर” पाठ निःशुल्क है?

हाँ — Swift Academy अध्ययन पथ के 3 तक कोई भी पाठ, जिसमें “असुरक्षित बफ़र पॉइंटर” भी शामिल है, यहाँ वेब पर पूरा पढ़ना निःशुल्क है। इसके बाद CoddyKit PRO हर पाठ अनलॉक करता है, साथ ही अंतर्निर्मित कोड संपादक और चौबीसों घंटे एआई शिक्षक के साथ इंटरैक्टिव अभ्यास भी उपलब्ध कराता है। Swift Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।

“असुरक्षित बफ़र पॉइंटर” में मैं क्या सीखूँगा?

सन्निहित मेमोरी को कुशलता से प्रोसेस कीजिए। आप ब्राउज़र में सीधे चलाए जाने वाले व्यावहारिक कोड के साथ Swift Academy का अभ्यास करते हैं, और पाठ पूरा करते समय 24/7 एआई ट्यूटर आपके प्रश्नों के उत्तर देता है।

क्या Swift Academy शुरू करने के लिए मुझे किसी अनुभव की आवश्यकता है?

पहले के अनुभव की आवश्यकता नहीं है। CoddyKit पर Swift Academy शुरुआती से लेकर उन्नत शिक्षार्थियों तक सभी के लिए व्यवस्थित किया गया है, इसलिए आप यहीं से या शुरुआत से सीखना शुरू कर सकते हैं और अपनी गति से आगे बढ़ सकते हैं। यह 4 में से 3वाँ पाठ है।

“असुरक्षित बफ़र पॉइंटर” पाठ पूरा करने में कितना समय लगता है?

CoddyKit का अधिकांश पाठ लगभग 5–10 मिनट में पूरा हो जाता है। हर पाठ छोटा और संवादात्मक है, इसलिए आप लगातार प्रगति करते हैं और वेब या ऐप पर वहीं से सीखना जारी रख सकते हैं जहाँ आपने छोड़ा था।

क्या मैं इस Swift Academy पाठ में कोड लिख और चला सकता हूँ?

हाँ। हर Swift Academy पाठ में एक अंतर्निर्मित कोड संपादक शामिल है, जिससे आप सीधे अपने ब्राउज़र में वास्तविक कोड लिख और चला सकते हैं और तुरंत एआई प्रतिक्रिया पा सकते हैं—स्थानीय सेटअप की आवश्यकता नहीं है।

इस पाठ्यक्रम के सभी पाठ

  1. MemoryLayout और अलाइनमेंट
  2. UnsafePointer और UnsafeMutablePointer
  3. असुरक्षित बफ़र पॉइंटर
  4. withUnsafeBytes और C इंटरऑप
← Swift Academy पर वापस जाएँ