<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Rust on kenji.blog</title><link>http://kenji.blog/hi/categories/rust/</link><description>Recent content in Rust on kenji.blog</description><generator>Hugo -- gohugo.io</generator><language>hi</language><copyright>kenjinote</copyright><lastBuildDate>Sat, 12 Sep 2026 04:00:00 +0900</lastBuildDate><atom:link href="http://kenji.blog/hi/categories/rust/index.xml" rel="self" type="application/rss+xml"/><item><title>C++ पॉइंटर्स के साथ Rust के "स्वामित्व" और "उधार" की तुलना और व्याख्या</title><link>http://kenji.blog/hi/p/rust-ownership-borrowing-cpp-pointer-comparison/</link><pubDate>Sat, 12 Sep 2026 04:00:00 +0900</pubDate><guid>http://kenji.blog/hi/p/rust-ownership-borrowing-cpp-pointer-comparison/</guid><description>&lt;img src="http://kenji.blog/p/rust-ownership-borrowing-cpp-pointer-comparison/img/eyecatch.jpg" alt="Featured image of post C++ पॉइंटर्स के साथ Rust के "स्वामित्व" और "उधार" की तुलना और व्याख्या" />&lt;p>आधुनिक सिस्टम प्रोग्रामिंग में, प्रदर्शन और मेमोरी सुरक्षा को संतुलित करना एक शाश्वत चुनौती है। C++ लंबे समय से इस क्षेत्र का राजा रहा है, लेकिन हाल के वर्षों में Rust इसकी स्थिति के लिए खतरा बन रहा है। Rust की सबसे बड़ी विशेषता &amp;ldquo;स्वामित्व&amp;rdquo; (Ownership) और &amp;ldquo;उधार&amp;rdquo; (Borrowing) की अवधारणा है, जो बिना कचरा संग्रहण (Garbage Collection या GC) के संकलन के समय (compile time) मेमोरी सुरक्षा की गारंटी देती है।&lt;/p>
&lt;p>इस लेख में, हम C++ के पॉइंटर्स (raw pointers, &lt;code>std::unique_ptr&lt;/code>, &lt;code>std::shared_ptr&lt;/code>) और Rust के स्वामित्व मॉडल की विस्तार से तुलना करेंगे। हम कोड उदाहरणों और आरेखों के साथ गहराई से बताएंगे कि Rust का कंपाइलर (बरो चेकर) यूज़-आफ्टर-फ्री (Use-After-Free) और डेटा रेस (Data Race) को कैसे रोकता है।&lt;/p>
&lt;h2 id="1-ममर-परबधन-क-मल-ततव-सटक-और-हप">1. मेमोरी प्रबंधन के मूल तत्व: स्टैक और हीप
&lt;/h2>&lt;p>मेमोरी प्रबंधन की मूल बातें समझने के लिए, आइए पहले देखें कि कोई प्रोग्राम मेमोरी का उपयोग कैसे करता है। मेमोरी क्षेत्र को मोटे तौर पर &amp;ldquo;स्टैक&amp;rdquo; (Stack) और &amp;ldquo;हीप&amp;rdquo; (Heap) में वर्गीकृत किया जाता है।&lt;/p>
&lt;h3 id="सटक-stack">स्टैक (Stack)
&lt;/h3>&lt;p>यह वह क्षेत्र है जहाँ फ़ंक्शन कॉल के दौरान स्थानीय चर आदि जमा किए जाते हैं। इसकी LIFO (लास्ट-इन, फर्स्ट-आउट) संरचना है, और मेमोरी आवंटन/मुक्ति (allocation/deallocation) बहुत तेज़ है। इसमें केवल वह डेटा रखा जाता है जिसका आकार संकलन के समय (compile time) निर्धारित किया जा सकता है।&lt;/p>
&lt;h3 id="हप-heap">हीप (Heap)
&lt;/h3>&lt;p>इसमें वह डेटा रखा जाता है जिसका आकार रनटाइम पर गतिशील रूप से निर्धारित होता है, या वह डेटा जिसे फ़ंक्शन के दायरे (scope) से परे जीवित रहने की आवश्यकता होती है। इसे पॉइंटर्स (या संदर्भों) के माध्यम से एक्सेस किया जाता है।&lt;/p>
&lt;p>बिना कचरा संग्रहण वाले C++ और Rust में, हीप मेमोरी प्रबंधन की लागत को निम्न सूत्र के रूप में मॉडल किया जा सकता है। मान लीजिए कि वस्तुओं की कुल संख्या $N$ है, आवंटन के लिए औसत समय $T_{alloc}$ है, और मुक्ति के लिए औसत समय $T_{dealloc}$ है। तब कुल मेमोरी प्रबंधन लागत $C_{memory}$ होगी:&lt;/p>
$$ C_{memory} = \sum_{i=1}^{N} (T_{alloc, i} + T_{dealloc, i}) + O_{sync} $$
&lt;p>यहाँ, $O_{sync}$ मल्टी-थ्रेडेड वातावरण में पारस्परिक अपवर्जन (mutual exclusion जैसे कि म्यूटेक्स या परमाणु संचालन) का ओवरहेड है। चूंकि Rust संकलन के समय मेमोरी मुक्ति का समय निर्धारित करता है, यह रनटाइम पर कचरा संग्रहण के कारण थ्रूपुट में कमी (Stop-The-World) को शून्य कर देता है, और $T_{dealloc}$ को विश्वसनीय और सुरक्षित समय पर निष्पादित करता है।&lt;/p>
&lt;div class="mermaid">graph TD
A["प्रोग्राम मेमोरी"] --> B["स्टैक (तेज़, निश्चित आकार)"]
A --> C["हीप (गतिशील, धीमा)"]
B --> D["स्थानीय चर"]
B --> E["पॉइंटर्स/संदर्भ"]
C --> F["गतिशील रूप से आवंटित डेटा"]
E -.->|"इंगित करता है"| F&lt;/div>
&lt;h2 id="2-c-पइटरस-सवततरत-और-खतर-क-बच-क-वयपर">2. C++ पॉइंटर्स: स्वतंत्रता और खतरे के बीच का व्यापार
&lt;/h2>&lt;p>आइए C++ में मेमोरी प्रबंधन के विकास पर एक नज़र डालें।&lt;/p>
&lt;h3 id="र-पइटरस-raw-pointers-क-यग-और-समसयए">रॉ पॉइंटर्स (Raw Pointers) का युग और समस्याएं
&lt;/h3>&lt;p>C भाषा से विरासत में मिले रॉ पॉइंटर्स (&lt;code>*&lt;/code>) परम स्वतंत्रता प्रदान करते हैं, लेकिन साथ ही वे निम्नलिखित गंभीर बग्स का कारण भी बनते हैं:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>मेमोरी लीक (Memory Leak)&lt;/strong>: &lt;code>new&lt;/code> के साथ आवंटित मेमोरी को &lt;code>delete&lt;/code> करना भूल जाना।&lt;/li>
&lt;li>&lt;strong>डैंगलिंग पॉइंटर (Dangling Pointer)&lt;/strong>: मेमोरी मुक्त होने (&lt;code>delete&lt;/code>) के बाद पॉइंटर को एक्सेस करना।&lt;/li>
&lt;li>&lt;strong>डबल फ्री (Double Free)&lt;/strong>: एक ही मेमोरी क्षेत्र को दो बार &lt;code>delete&lt;/code> करना।&lt;/li>
&lt;/ul>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-cpp" data-lang="cpp">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// C++: रॉ पॉइंटर के कारण होने वाली समस्या का उदाहरण
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="kt">void&lt;/span> &lt;span class="nf">rawPointerExample&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kt">int&lt;/span>&lt;span class="o">*&lt;/span> &lt;span class="n">ptr&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="k">new&lt;/span> &lt;span class="kt">int&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">10&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// ... कुछ कार्य ...
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="k">delete&lt;/span> &lt;span class="n">ptr&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// गलती से फिर से एक्सेस करना (Use-After-Free / Dangling Pointer)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="c1">// C++ कंपाइलर इसे संकलन त्रुटि (compile error) नहीं बना सकता
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">cout&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="o">*&lt;/span>&lt;span class="n">ptr&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">endl&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="c1">// अपरिभाषित व्यवहार (Undefined Behavior)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h3 id="raii-और-समरट-पइटरस-क-उदय-c11-और-उसक-बद">RAII और स्मार्ट पॉइंटर्स का उदय (C++11 और उसके बाद)
&lt;/h3>&lt;p>C++11 के बाद से, RAII (Resource Acquisition Is Initialization) अवधारणा पर आधारित स्मार्ट पॉइंटर्स को मानकीकृत किया गया, और रॉ पॉइंटर्स के सीधे उपयोग को हतोत्साहित किया गया।&lt;/p>
&lt;h4 id="stdunique_ptr">&lt;code>std::unique_ptr&lt;/code>
&lt;/h4>&lt;p>यह एक पॉइंटर है जो व्यक्त करता है कि स्वामित्व एकल है। जब यह दायरे (scope) से बाहर हो जाता है, तो मेमोरी स्वचालित रूप से मुक्त हो जाती है। इसे कॉपी नहीं किया जा सकता है; स्वामित्व को केवल &amp;ldquo;स्थानांतरित&amp;rdquo; (move) किया जा सकता है (&lt;code>std::move&lt;/code> का उपयोग करके)।&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-cpp" data-lang="cpp">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// C++: std::unique_ptr
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="cp">#include&lt;/span> &lt;span class="cpf">&amp;lt;memory&amp;gt;&lt;/span>&lt;span class="cp">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#include&lt;/span> &lt;span class="cpf">&amp;lt;iostream&amp;gt;&lt;/span>&lt;span class="cp">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kt">void&lt;/span> &lt;span class="nf">uniquePtrExample&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">unique_ptr&lt;/span>&lt;span class="o">&amp;lt;&lt;/span>&lt;span class="kt">int&lt;/span>&lt;span class="o">&amp;gt;&lt;/span> &lt;span class="n">p1&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">make_unique&lt;/span>&lt;span class="o">&amp;lt;&lt;/span>&lt;span class="kt">int&lt;/span>&lt;span class="o">&amp;gt;&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">42&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// std::unique_ptr&amp;lt;int&amp;gt; p2 = p1; // संकलन त्रुटि (कॉपी नहीं किया जा सकता)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">unique_ptr&lt;/span>&lt;span class="o">&amp;lt;&lt;/span>&lt;span class="kt">int&lt;/span>&lt;span class="o">&amp;gt;&lt;/span> &lt;span class="n">p3&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">move&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">p1&lt;/span>&lt;span class="p">);&lt;/span> &lt;span class="c1">// स्वामित्व का स्थानांतरण
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// C++ की कमजोरी: स्थानांतरित होने के बाद p1 nullptr हो जाता है, लेकिन एक्सेस स्वयं संकलित हो सकता है
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="c1">// जो रनटाइम पर क्रैश (segmentation fault) का कारण बनेगा
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="c1">// std::cout &amp;lt;&amp;lt; *p1 &amp;lt;&amp;lt; std::endl;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h4 id="stdshared_ptr">&lt;code>std::shared_ptr&lt;/code>
&lt;/h4>&lt;p>यह एक पॉइंटर है जो कई पॉइंटर्स को एक ही ऑब्जेक्ट साझा करने की अनुमति देता है। यह संदर्भ गणना (Reference Counting) का उपयोग करता है, और गिनती शून्य होने पर मेमोरी को मुक्त करता है। चूंकि इसके लिए परमाणु वृद्धि/कमी संचालन की आवश्यकता होती है, इसलिए इसमें थोड़ा प्रदर्शन ओवरहेड (पहले उल्लेखित $O_{sync}$ के समतुल्य) होता है।&lt;/p>
&lt;h2 id="3-rust-क-सवमतव-ownership-एक-आदरश-बदलव-paradigm-shift">3. Rust का स्वामित्व (Ownership): एक आदर्श बदलाव (Paradigm Shift)
&lt;/h2>&lt;p>Rust ने C++ के &lt;code>std::unique_ptr&lt;/code> की अवधारणा को अपनी भाषा विनिर्देशन के मूल में रखा है और इसका एक सख्त &amp;ldquo;स्वामित्व मॉडल&amp;rdquo; है।&lt;/p>
&lt;h3 id="सवमतव-क-3-नयम">स्वामित्व के 3 नियम
&lt;/h3>&lt;p>Rust का स्वामित्व सिस्टम निम्नलिखित तीन अत्यंत सरल नियमों पर आधारित है:&lt;/p>
&lt;ol>
&lt;li>&lt;strong>Rust में प्रत्येक मूल्य (value) का एक चर (variable) होता है जिसे उसका स्वामी (owner) कहा जाता है।&lt;/strong>&lt;/li>
&lt;li>&lt;strong>एक समय में केवल एक ही स्वामी हो सकता है।&lt;/strong>&lt;/li>
&lt;li>&lt;strong>जब स्वामी दायरे (scope) से बाहर हो जाता है, मूल्य नष्ट हो जाता है।&lt;/strong>&lt;/li>
&lt;/ol>
&lt;p>Rust में डिफ़ॉल्ट रूप से संसाधनों को &amp;ldquo;स्थानांतरित&amp;rdquo; (move) किया जाता है। C++ के &lt;code>std::move&lt;/code> को स्पष्ट रूप से निर्दिष्ट किए बिना, असाइनमेंट ऑपरेशन से स्वामित्व स्थानांतरित हो जाता है।&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;span class="lnt">5
&lt;/span>&lt;span class="lnt">6
&lt;/span>&lt;span class="lnt">7
&lt;/span>&lt;span class="lnt">8
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-rust" data-lang="rust">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// Rust: स्वामित्व का स्थानांतरण (Move)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">fn&lt;/span> &lt;span class="nf">main&lt;/span>&lt;span class="p">()&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">{&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="kd">let&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">s1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">String&lt;/span>::&lt;span class="n">from&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;hello&amp;#34;&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c1">// हीप में आवंटित डेटा
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="kd">let&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">s2&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">s1&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c1">// स्वामित्व s1 से s2 में स्थानांतरित (move) हो जाता है
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="c1">// C++ के साथ सबसे बड़ा अंतर: स्थानांतरित चर तक पहुंच &amp;#34;संकलन त्रुटि&amp;#34; (compile error) बन जाती है!
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c1">// println!(&amp;#34;{}, world!&amp;#34;, s1); // संकलन त्रुटि: value borrowed here after move
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="p">}&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>यह सुविधा जो &amp;ldquo;स्थानांतरित चर तक पहुंच को संकलन समय पर अक्षम कर देती है&amp;rdquo;, उन कारणों में से एक है कि Rust C++ के &lt;code>std::unique_ptr&lt;/code> से अधिक सुरक्षित क्यों है।&lt;/p>
&lt;div class="mermaid">sequenceDiagram
participant S1 as "चर s1"
participant Heap as "हीप मेमोरी ('hello')"
participant S2 as "चर s2"
S1->>Heap: "आवंटित करता है और स्वामित्व रखता है"
Note over S1,S2: "let s2 = s1;"
S1--xHeap: "स्वामित्व खो देता है (अमान्य)"
S2->>Heap: "स्वामित्व ले लेता है"&lt;/div>
&lt;h2 id="4-उधर-borrowing-और-सदरभ-references">4. उधार (Borrowing) और संदर्भ (References)
&lt;/h2>&lt;p>यदि स्वामित्व हमेशा स्थानांतरित किया जाता है, तो हर बार फ़ंक्शन में मूल्य पास करने पर आपको स्वामित्व वापस लेना होगा, जो बहुत असुविधाजनक है। यहीं पर &amp;ldquo;उधार&amp;rdquo; (Borrowing) खेल में आता है। यह C++ पॉइंटर्स या संदर्भों के समतुल्य है।&lt;/p>
&lt;p>Rust में उधार दो प्रकार के होते हैं:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>अपरिवर्तनीय संदर्भ (Immutable Reference)&lt;/strong>: &lt;code>&amp;amp;T&lt;/code> (C++ के &lt;code>const T&amp;amp;&lt;/code> के समान)&lt;/li>
&lt;li>&lt;strong>परिवर्तनीय संदर्भ (Mutable Reference)&lt;/strong>: &lt;code>&amp;amp;mut T&lt;/code> (C++ के &lt;code>T&amp;amp;&lt;/code> के समान)&lt;/li>
&lt;/ul>
&lt;h3 id="बर-चकर-borrow-checker-क-कठर-नयम">बरो चेकर (Borrow Checker) के कठोर नियम
&lt;/h3>&lt;p>Rust के कंपाइलर में एक अंतर्निहित &amp;ldquo;बरो चेकर&amp;rdquo; होता है जो संदर्भों की वैधता की पुष्टि करता है। बरो चेकर निम्नलिखित सख्त नियमों को लागू करता है:&lt;/p>
&lt;blockquote>
&lt;p>किसी भी दायरे (scope) में, किसी भी समय, केवल निम्नलिखित में से एक मौजूद हो सकता है:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>एक परिवर्तनीय संदर्भ (&lt;code>&amp;amp;mut T&lt;/code>)&lt;/strong>&lt;/li>
&lt;li>&lt;strong>कई अपरिवर्तनीय संदर्भ (&lt;code>&amp;amp;T&lt;/code>)&lt;/strong>&lt;/li>
&lt;/ul>
&lt;/blockquote>
&lt;p>इसे &lt;strong>&amp;ldquo;मल्टीपल रीडर्स एक्सओआर सिंगल राइटर (MRSW)&amp;rdquo;&lt;/strong> सिद्धांत कहा जाता है। इसे गणितीय अनन्य OR (XOR) द्वारा दर्शाया जा सकता है। एक स्थिति $S$ के लिए, अपरिवर्तनीय संदर्भों की संख्या $N_r$ और परिवर्तनीय संदर्भों की संख्या $N_w$ को निम्नलिखित बाधा को पूरा करना होगा:&lt;/p>
$$ (N_r \ge 0 \land N_w = 0) \oplus (N_r = 0 \land N_w = 1) $$
&lt;p>इस नियम के माध्यम से, &lt;strong>डेटा रेस (Data Race) संकलन समय (compile time) पर पूरी तरह से समाप्त हो जाता है&lt;/strong>। डेटा रेस तब होता है जब: ① दो या दो से अधिक पॉइंटर्स एक ही डेटा तक एक साथ पहुंचते हैं, ② कम से कम एक लिख रहा होता है (write operation), और ③ कोई सिंक्रनाइज़ेशन तंत्र नहीं होता है। Rust संकलन समय पर स्थिति ② को नष्ट करके डेटा रेस को रोकता है।&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-rust" data-lang="rust">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// Rust: उधार नियम के उल्लंघन के कारण संकलन त्रुटि
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">fn&lt;/span> &lt;span class="nf">main&lt;/span>&lt;span class="p">()&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">{&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="kd">let&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">mut&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">s&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">String&lt;/span>::&lt;span class="n">from&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;hello&amp;#34;&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="kd">let&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">r1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">&amp;amp;&lt;/span>&lt;span class="n">s&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c1">// अपरिवर्तनीय उधार (OK)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="kd">let&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">r2&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">&amp;amp;&lt;/span>&lt;span class="n">s&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c1">// अपरिवर्तनीय उधार (OK)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c1">// let r3 = &amp;amp;mut s; // त्रुटि! अपरिवर्तनीय उधार मौजूद होने पर परिवर्तनीय उधार नहीं बनाया जा सकता
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="fm">println!&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;&lt;/span>&lt;span class="si">{}&lt;/span>&lt;span class="s">, &lt;/span>&lt;span class="si">{}&lt;/span>&lt;span class="s">&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">r1&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">r2&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="p">}&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h2 id="5-इटरटर-अमनयकरण-iterator-invalidation-क-रकथम">5. इटरेटर अमान्यकरण (Iterator Invalidation) की रोकथाम
&lt;/h2>&lt;p>बरो चेकर की शक्ति के सबसे ठोस उदाहरण के रूप में, आइए &amp;ldquo;इटरेटर अमान्यकरण&amp;rdquo; (Iterator Invalidation) नामक एक क्लासिक बग देखें।&lt;/p>
&lt;h3 id="c-म-इटरटर-अमनयकरण-रनटइम-करश">C++ में इटरेटर अमान्यकरण (रनटाइम क्रैश)
&lt;/h3>&lt;p>यदि आप लूप के दौरान C++ &lt;code>std::vector&lt;/code> को संशोधित करते हैं, तो इसके पीछे की मेमोरी फिर से आवंटित (Reallocation) हो सकती है, और संदर्भ एक डैंगलिंग पॉइंटर बन जाएगा।&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;span class="lnt">18
&lt;/span>&lt;span class="lnt">19
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-cpp" data-lang="cpp">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// C++: इटरेटर अमान्यकरण बग
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="cp">#include&lt;/span> &lt;span class="cpf">&amp;lt;iostream&amp;gt;&lt;/span>&lt;span class="cp">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#include&lt;/span> &lt;span class="cpf">&amp;lt;vector&amp;gt;&lt;/span>&lt;span class="cp">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kt">int&lt;/span> &lt;span class="nf">main&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">vector&lt;/span>&lt;span class="o">&amp;lt;&lt;/span>&lt;span class="kt">int&lt;/span>&lt;span class="o">&amp;gt;&lt;/span> &lt;span class="n">v&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">{&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">2&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">3&lt;/span>&lt;span class="p">};&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// वेक्टर के तत्व का संदर्भ प्राप्त करें
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="kt">int&lt;/span>&lt;span class="o">&amp;amp;&lt;/span> &lt;span class="n">first&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">v&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">];&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// तत्व जोड़ें (यदि यहाँ क्षमता अपर्याप्त है, तो एक नया मेमोरी क्षेत्र आवंटित किया जाएगा,
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="c1">// और पुराना क्षेत्र नष्ट हो सकता है)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="n">v&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">push_back&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">4&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// first पहले से ही मुक्त मेमोरी को इंगित कर रहा हो सकता है! (अपरिभाषित व्यवहार)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">cout&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="s">&amp;#34;The first element is: &amp;#34;&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="n">first&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">endl&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h3 id="rust-क-सकलन-समय-बचव">Rust का संकलन-समय बचाव
&lt;/h3>&lt;p>आइए ठीक इसी तर्क को Rust में लिखें।&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-rust" data-lang="rust">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// Rust: संकलन समय पर इटरेटर अमान्यकरण को रोकना
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">fn&lt;/span> &lt;span class="nf">main&lt;/span>&lt;span class="p">()&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">{&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="kd">let&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">mut&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">v&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="fm">vec!&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">3&lt;/span>&lt;span class="p">];&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="c1">// अपरिवर्तनीय संदर्भ प्राप्त करें (उधार शुरू)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="kd">let&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">first&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">&amp;amp;&lt;/span>&lt;span class="n">v&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">];&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="c1">// त्रुटि! जबकि `first` `v` को अपरिवर्तनीय रूप से उधार ले रहा है,
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c1">// हम `v.push` के लिए आवश्यक परिवर्तनीय उधार नहीं ले सकते।
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c1">// v.push(4);
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="fm">println!&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;The first element is: &lt;/span>&lt;span class="si">{}&lt;/span>&lt;span class="s">&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">first&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="p">}&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>इस तरह, चूँकि Rust कंपाइलर स्तर पर &amp;ldquo;किसी मान को पढ़ते समय (अपरिवर्तनीय उधार) उसे बदलना (परिवर्तनीय उधार)&amp;rdquo; सख्त मना करता है, यूज़-आफ्टर-फ्री और इटरेटर अमान्यकरण जैसे घातक बग संकलन समय पर निश्चित रूप से पकड़े जाते हैं।&lt;/p>
&lt;div class="mermaid">graph LR
A["चर v (स्वामी)"] --> B["हीप ऐरे [1, 2, 3]"]
C["संदर्भ 'first' (&amp;v[0])"] -.->|"अपरिवर्तनीय उधार"| B
A -->|X "परिवर्तनीय उधार अस्वीकृत!"| D["v.push(4)"]
style C stroke:#00FF00,stroke-width:2px
style D stroke:#FF0000,stroke-width:2px&lt;/div>
&lt;h2 id="6-rust-म-सझ-सवमतव-rc-और-arc">6. Rust में साझा स्वामित्व: &lt;code>Rc&lt;/code> और &lt;code>Arc&lt;/code>
&lt;/h2>&lt;p>Rust साझा स्वामित्व (Shared Ownership) भी प्रदान करता है जो C++ के &lt;code>std::shared_ptr&lt;/code> के बराबर है, लेकिन प्रकारों को सिंगल-थ्रेडेड और मल्टी-थ्रेडेड उपयोग के लिए स्पष्ट रूप से अलग किया गया है।&lt;/p>
&lt;h3 id="सगल-थरडड-उपयग-क-लए-rct-reference-counted">सिंगल-थ्रेडेड उपयोग के लिए: &lt;code>Rc&amp;lt;T&amp;gt;&lt;/code> (Reference Counted)
&lt;/h3>&lt;p>&lt;code>Rc&amp;lt;T&amp;gt;&lt;/code> एक गैर-थ्रेड-सुरक्षित संदर्भ-गिने जाने वाला स्मार्ट पॉइंटर है। यह परमाणु (atomic) निर्देशों का उपयोग किए बिना गिनती बढ़ाता/घटाता है, जिससे यह एक थ्रेड के भीतर बहुत तेज़ हो जाता है। हालाँकि, यदि आप इसे दूसरे थ्रेड में भेजने का प्रयास करते हैं, तो एक संकलन त्रुटि होगी (क्योंकि यह &lt;code>Send&lt;/code> ट्रेट को लागू नहीं करता है)।&lt;/p>
&lt;h3 id="मलट-थरडड-उपयग-क-लए-arct-atomic-reference-counted">मल्टी-थ्रेडेड उपयोग के लिए: &lt;code>Arc&amp;lt;T&amp;gt;&lt;/code> (Atomic Reference Counted)
&lt;/h3>&lt;p>थ्रेड्स के बीच साझा करते समय, हम &lt;code>Arc&amp;lt;T&amp;gt;&lt;/code> का उपयोग करते हैं, जो परमाणु वृद्धि/कमी करता है। इसमें C++ के &lt;code>std::shared_ptr&lt;/code> के समान लागत होती है।&lt;/p>
&lt;p>इसके अलावा, C++ में, यदि कई थ्रेड एक साथ &lt;code>std::shared_ptr&lt;/code> द्वारा साझा किए गए चर में लिखते हैं, तो डेटा रेस होता है। इसे रोकने के लिए, आपको &lt;code>std::mutex&lt;/code> का सही ढंग से उपयोग करना होगा।&lt;/p>
&lt;p>दूसरी ओर, Rust में, आप अकेले &lt;code>Arc&amp;lt;T&amp;gt;&lt;/code> के साथ &lt;strong>आंतरिक डेटा को संशोधित नहीं कर सकते&lt;/strong> हैं। यदि संशोधन की आवश्यकता है, तो इसे म्यूटेक्स &lt;code>Mutex&amp;lt;T&amp;gt;&lt;/code> के साथ जोड़ा जाना चाहिए।&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;span class="lnt">18
&lt;/span>&lt;span class="lnt">19
&lt;/span>&lt;span class="lnt">20
&lt;/span>&lt;span class="lnt">21
&lt;/span>&lt;span class="lnt">22
&lt;/span>&lt;span class="lnt">23
&lt;/span>&lt;span class="lnt">24
&lt;/span>&lt;span class="lnt">25
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-rust" data-lang="rust">&lt;span class="line">&lt;span class="cl">&lt;span class="k">use&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">std&lt;/span>::&lt;span class="n">sync&lt;/span>::&lt;span class="p">{&lt;/span>&lt;span class="n">Arc&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">Mutex&lt;/span>&lt;span class="p">};&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">use&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">std&lt;/span>::&lt;span class="n">thread&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">fn&lt;/span> &lt;span class="nf">main&lt;/span>&lt;span class="p">()&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">{&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="c1">// थ्रेड-सुरक्षित साझाकरण और पारस्परिक अपवर्जन का संयोजन
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c1">// C++ के std::shared_ptr&amp;lt;std::mutex&amp;gt; के समान है, लेकिन Mutex डेटा को समाहित करता है
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="kd">let&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">counter&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">Arc&lt;/span>::&lt;span class="n">new&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">Mutex&lt;/span>::&lt;span class="n">new&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">));&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="kd">let&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">mut&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">handles&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="fm">vec!&lt;/span>&lt;span class="p">[];&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="k">for&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">_&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">in&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="o">..&lt;/span>&lt;span class="mi">10&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">{&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="kd">let&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">counter_clone&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">Arc&lt;/span>::&lt;span class="n">clone&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="o">&amp;amp;&lt;/span>&lt;span class="n">counter&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="kd">let&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">handle&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">thread&lt;/span>::&lt;span class="n">spawn&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="k">move&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">||&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">{&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="c1">// lock() को कॉल करने पर ही आप आंतरिक परिवर्तनीय संदर्भ (&amp;amp;mut i32) प्राप्त कर सकते हैं
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="kd">let&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">mut&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">num&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">counter_clone&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">lock&lt;/span>&lt;span class="p">().&lt;/span>&lt;span class="n">unwrap&lt;/span>&lt;span class="p">();&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="o">*&lt;/span>&lt;span class="n">num&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">+=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="p">});&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c1">// RAII के कारण दायरे (scope) से बाहर निकलते ही लॉक स्वचालित रूप से जारी हो जाता है
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">handles&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">push&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">handle&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="p">}&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="k">for&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">handle&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">in&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">handles&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">{&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">handle&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">join&lt;/span>&lt;span class="p">().&lt;/span>&lt;span class="n">unwrap&lt;/span>&lt;span class="p">();&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="p">}&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="fm">println!&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;Result: &lt;/span>&lt;span class="si">{}&lt;/span>&lt;span class="s">&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">*&lt;/span>&lt;span class="n">counter&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">lock&lt;/span>&lt;span class="p">().&lt;/span>&lt;span class="n">unwrap&lt;/span>&lt;span class="p">());&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="p">}&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>उल्लेखनीय बात यह है कि Rust का &lt;code>Mutex&amp;lt;T&amp;gt;&lt;/code> केवल एक लॉकिंग तंत्र नहीं है, बल्कि &lt;strong>&amp;ldquo;सुरक्षित किए जाने वाले डेटा को एक प्रकार (type) के रूप में समाहित करता है&amp;rdquo;&lt;/strong>। यह संकलन स्तर पर &amp;ldquo;लॉक प्राप्त करना भूल जाना और डेटा तक पहुंचना&amp;rdquo; जैसी गलतियों को पूरी तरह से रोकता है। जब तक आप लॉक (&lt;code>lock()&lt;/code>) प्राप्त नहीं करते हैं, तब तक आप आंतरिक डेटा तक पहुंचने के अधिकार (संदर्भ) प्राप्त नहीं कर सकते हैं।&lt;/p>
&lt;h2 id="नषकरष-कपइलर-दवर-परव-नरकषण-य-डवलपर-दवर-सवय-क-जममदर">निष्कर्ष: कंपाइलर द्वारा &amp;ldquo;पूर्व-निरीक्षण&amp;rdquo; या डेवलपर द्वारा &amp;ldquo;स्वयं की जिम्मेदारी&amp;rdquo;?
&lt;/h2>&lt;p>C++ पॉइंटर्स और स्मार्ट पॉइंटर्स डेवलपर्स को उच्च स्तर का नियंत्रण और प्रदर्शन प्रदान करते हैं, लेकिन उनका सही उपयोग डेवलपर्स के अनुशासन पर निर्भर करता है। RAII और &lt;code>std::unique_ptr&lt;/code> की शुरुआत ने C++ को नाटकीय रूप से सुरक्षित बना दिया है, लेकिन यह अभी भी &amp;ldquo;अपरिभाषित व्यवहार&amp;rdquo; (undefined behavior) जैसे कि मूव के बाद एक्सेस या इटरेटर अमान्यकरण को भाषा स्तर पर पूरी तरह से नहीं रोक सकता है।&lt;/p>
&lt;p>दूसरी ओर, Rust कंपाइलर में स्वामित्व (Ownership) और उधार (Borrowing) के नियमों को शामिल करके रनटाइम के बजाय &lt;strong>संकलन समय (compile time)&lt;/strong> पर इन त्रुटियों का पता लगाता है। &amp;ldquo;यदि यह संकलित होता है, तो यह मेमोरी सुरक्षित है&amp;rdquo; की यह मजबूत गारंटी सबसे बड़ा कारण है कि Rust सिस्टम प्रोग्रामिंग में तेजी से समर्थन प्राप्त कर रहा है।&lt;/p>
&lt;p>Rust के बरो चेकर से लड़ना (Fight the borrow checker) शुरुआती लोगों के लिए एक बड़ी बाधा हो सकती है, लेकिन यह केवल कंपाइलर द्वारा &amp;ldquo;पॉइंटर के जीवनकाल को ट्रैक करने&amp;rdquo; की जटिल गणना को सख्ती से करने के लिए है, जो मूल रूप से C++ प्रोग्रामर्स को अपने दिमाग में करना पड़ता था।&lt;/p>
&lt;p>C++ पॉइंटर्स की स्वतंत्रता और खतरों को समझने के बाद Rust सीखने से आपको स्वामित्व मॉडल के पीछे &amp;ldquo;यह डिज़ाइन क्यों चुना गया&amp;rdquo; के दर्शन को अधिक गहराई से समझने में मदद मिलेगी।&lt;/p>
&lt;hr>
&lt;p>&lt;em>यह लेख C++ और Rust के बीच मेमोरी प्रबंधन तकनीकों का तुलनात्मक अध्ययन है। हमें उम्मीद है कि यह प्रत्येक परियोजना की आवश्यकताओं के अनुसार उपयुक्त भाषा चुनने के लिए एक संदर्भ के रूप में कार्य करेगा।&lt;/em>&lt;/p></description></item><item><title>C++ इंजीनियर द्वारा Rust सीखने पर महसूस किए गए फायदे और नुकसान</title><link>http://kenji.blog/hi/p/cpp-engineer-learning-rust-pros-cons/</link><pubDate>Sat, 12 Sep 2026 03:00:00 +0900</pubDate><guid>http://kenji.blog/hi/p/cpp-engineer-learning-rust-pros-cons/</guid><description>&lt;img src="http://kenji.blog/p/cpp-engineer-learning-rust-pros-cons/img/eyecatch.jpg" alt="Featured image of post C++ इंजीनियर द्वारा Rust सीखने पर महसूस किए गए फायदे और नुकसान" />&lt;h1 id="परसतवन-ससटम-परगरमग-क-एक-नई-सबह">प्रस्तावना: सिस्टम प्रोग्रामिंग की एक नई सुबह
&lt;/h1>&lt;p>आधुनिक सॉफ्टवेयर इंजीनियरिंग में, C++ और Rust सिस्टम प्रोग्रामिंग के अग्रिम मोर्चे पर खड़े दो बड़े नाम हैं। कई वर्षों तक, C++ ऑपरेटिंग सिस्टम, एम्बेडेड डिवाइस, गेम इंजन, और हाई-फ्रीक्वेंसी ट्रेडिंग (HFT) सिस्टम जैसे हार्डवेयर के चरम प्रदर्शन को निकालने वाले क्षेत्रों में एक पूर्ण राजा के रूप में हावी रहा है। मैं खुद एक सीनियर C++ इंजीनियर के रूप में, C++98 युग के कच्चे पॉइंटर्स (raw pointers) के जंगल से शुरू करके, C++11 के आधुनिकीकरण की लहर (स्मार्ट पॉइंटर्स, लैम्ब्डा एक्सप्रेशन, &lt;code>auto&lt;/code> की शुरूआत), और C++14/17/20 के साथ निरंतर बढ़ती विशेषताओं के साथ कोड लिखता आ रहा हूँ।&lt;/p>
&lt;p>हालाँकि, हाल के वर्षों में, C++ की संरचनात्मक चुनौतियों - विशेष रूप से &amp;ldquo;मेमोरी सुरक्षा की कमी&amp;rdquo; के कारण होने वाली सुरक्षा कमजोरियों (माना जाता है कि लगभग 70% CVE मेमोरी से उत्पन्न होते हैं) और &amp;ldquo;अंतहीन रूप से जटिल विनिर्देशों और अपरिभाषित व्यवहार (UB)&amp;rdquo; के समाधान के रूप में Rust का नाटकीय उदय हुआ है। Linux कर्नेल में इसकी आधिकारिक स्वीकृति और Microsoft, Google, AWS जैसी बड़ी टेक कंपनियों द्वारा बड़े पैमाने पर Rust में माइग्रेशन प्रोजेक्ट, केवल एक अस्थायी चलन नहीं है, बल्कि सिस्टम प्रोग्रामिंग के पैराडाइम शिफ्ट को दर्शाता है।&lt;/p>
&lt;p>इस लेख में, एक सच्चे C++ इंजीनियर द्वारा वास्तव में गहराई से Rust को सीखने और व्यावहारिक उपयोग में महसूस किए गए &amp;ldquo;फायदे&amp;rdquo; और &amp;ldquo;नुकसान&amp;rdquo; की तकनीकी दृष्टिकोण से पूरी तरह से तुलना और व्याख्या की जाएगी, जो भाषा के मूल डिजाइन से संबंधित है।&lt;/p>
&lt;hr>
&lt;h1 id="1-ममर-मनजमट-क-परडइम-शफट-raii-स-ओनरशप-ownership-और-बरइग-borrowing-तक">1. मेमोरी मैनेजमेंट का पैराडाइम शिफ्ट: RAII से ओनरशिप (Ownership) और बॉरोइंग (Borrowing) तक
&lt;/h1>&lt;h2 id="c-क-raii-और-समरट-पइटरस-क-समए">C++ का RAII और स्मार्ट पॉइंटर्स की सीमाएँ
&lt;/h2>&lt;p>C++ के सबसे महान आविष्कारों में से एक &lt;strong>RAII (Resource Acquisition Is Initialization)&lt;/strong> है। कंस्ट्रक्टर में संसाधनों को आरक्षित करने और स्कोप से बाहर निकलते समय डिस्ट्रक्टर द्वारा उन्हें स्वचालित रूप से मुक्त करने की यह अवधारणा, मैन्युअल &lt;code>new&lt;/code> और &lt;code>delete&lt;/code> के कारण होने वाले मेमोरी लीक के डर से डेवलपर्स को मुक्त करती है। C++11 के बाद से &lt;code>std::unique_ptr&lt;/code> और &lt;code>std::shared_ptr&lt;/code> को मानक लाइब्रेरी में पेश किया गया, जिससे ओनरशिप (Ownership) की अवधारणा को कोड में व्यक्त करना संभव हो गया।&lt;/p>
&lt;p>लेकिन, C++ के स्मार्ट पॉइंटर्स और मूव सिमेंटिक्स (Move Semantics) में एक गंभीर कमजोरी है कि कंपाइलर द्वारा स्टेटिक सत्यापन अधूरा है।&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;span class="lnt">18
&lt;/span>&lt;span class="lnt">19
&lt;/span>&lt;span class="lnt">20
&lt;/span>&lt;span class="lnt">21
&lt;/span>&lt;span class="lnt">22
&lt;/span>&lt;span class="lnt">23
&lt;/span>&lt;span class="lnt">24
&lt;/span>&lt;span class="lnt">25
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-cpp" data-lang="cpp">&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#include&lt;/span> &lt;span class="cpf">&amp;lt;iostream&amp;gt;&lt;/span>&lt;span class="cp">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#include&lt;/span> &lt;span class="cpf">&amp;lt;memory&amp;gt;&lt;/span>&lt;span class="cp">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#include&lt;/span> &lt;span class="cpf">&amp;lt;string&amp;gt;&lt;/span>&lt;span class="cp">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kt">void&lt;/span> &lt;span class="nf">consume&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">unique_ptr&lt;/span>&lt;span class="o">&amp;lt;&lt;/span>&lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">string&lt;/span>&lt;span class="o">&amp;gt;&lt;/span> &lt;span class="n">ptr&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">cout&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="s">&amp;#34;Consuming: &amp;#34;&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="o">*&lt;/span>&lt;span class="n">ptr&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">endl&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kt">int&lt;/span> &lt;span class="nf">main&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">auto&lt;/span> &lt;span class="n">my_ptr&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">make_unique&lt;/span>&lt;span class="o">&amp;lt;&lt;/span>&lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">string&lt;/span>&lt;span class="o">&amp;gt;&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;Hello, C++&amp;#34;&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// ओनरशिप को फंक्शन में मूव (Move) करें
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="n">consume&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">move&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">my_ptr&lt;/span>&lt;span class="p">));&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// खतरा: C++ में मूव किए गए ऑब्जेक्ट तक पहुंचने पर कंपाइल एरर नहीं होता है
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="c1">// std::move केवल एक राइट-वैल्यू रेफरेंस (T&amp;amp;&amp;amp;) में कास्ट है, और कंपाइलर इसके उपयोग को नहीं रोकता है
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">my_ptr&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">cout&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="s">&amp;#34;Pointer is still valid?&amp;#34;&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">endl&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span> &lt;span class="k">else&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">cout&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="s">&amp;#34;Pointer is null.&amp;#34;&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">endl&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// std::cout &amp;lt;&amp;lt; *my_ptr &amp;lt;&amp;lt; std::endl; // मुक्त करने के बाद मेमोरी का उपयोग (Use-After-Free) के कारण अपरिभाषित व्यवहार
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="k">return&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>C++ में, &lt;code>std::move&lt;/code> द्वारा खाली किए गए (मान्य लेकिन अनिर्दिष्ट अवस्था वाले) ऑब्जेक्ट तक गलती से पहुँचने का जोखिम हमेशा बना रहता है। इससे रनटाइम क्रैश या सबसे खराब स्थिति में सुरक्षा भेद्यता हो सकती है।&lt;/p>
&lt;h2 id="rust-क-ओनरशप-ownership-और-बर-चकर-borrow-checker-क-परण-बचव">Rust की ओनरशिप (Ownership) और बॉरो चेकर (Borrow Checker) का पूर्ण बचाव
&lt;/h2>&lt;p>Rust इस &amp;ldquo;ओनरशिप&amp;rdquo; की अवधारणा को भाषा के मूल डिज़ाइन में शामिल करता है, और &lt;strong>बॉरो चेकर (Borrow Checker)&lt;/strong> नामक कंपाइलर की सुविधा द्वारा सख्त स्टेटिक विश्लेषण करता है।&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-rust" data-lang="rust">&lt;span class="line">&lt;span class="cl">&lt;span class="k">fn&lt;/span> &lt;span class="nf">consume&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">s&lt;/span>: &lt;span class="nb">String&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">{&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="fm">println!&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;Consuming: &lt;/span>&lt;span class="si">{}&lt;/span>&lt;span class="s">&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">s&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="p">}&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c1">// यहां s स्कोप से बाहर निकल जाता है, और मेमोरी मुक्त (Drop) हो जाती है
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">fn&lt;/span> &lt;span class="nf">main&lt;/span>&lt;span class="p">()&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">{&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="kd">let&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">my_string&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">String&lt;/span>::&lt;span class="n">from&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;Hello, Rust&amp;#34;&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="c1">// ओनरशिप को फंक्शन में मूव करें। Rust में डिफॉल्ट मूव सिमेंटिक्स होता है।
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">consume&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">my_string&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="c1">// कंपाइल एरर! मूव किए गए चर (variable) को बिल्कुल एक्सेस नहीं किया जा सकता
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c1">// println!(&amp;#34;Is it still there? {}&amp;#34;, my_string);
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="p">}&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Rust में, जैसे ही किसी वेरिएबल की ओनरशिप स्थानांतरित होती है, मूल वेरिएबल को कंपाइलर द्वारा &amp;ldquo;असंसाधित (uninitialized)&amp;rdquo; अवस्था के बराबर माना जाता है, और आगे की पहुँच को पूरी तरह से अवरुद्ध कर दिया जाता है। इसके कारण, &amp;ldquo;Use-After-Free (मुक्त होने के बाद मेमोरी का उपयोग)&amp;rdquo; और &amp;ldquo;Dangling Pointer (डैंगलिंग पॉइंटर)&amp;rdquo; जैसे बग सैद्धांतिक रूप से कंपाइल नहीं हो सकते हैं।&lt;/p>
&lt;div class="mermaid">graph TD
A["C++ std::unique_ptr"] --> B["std::move लागू किया गया"]
B --> C["ओनरशिप स्थानांतरित"]
C --> D["पुराना पॉइंटर अभी भी सुलभ है"]
D --> E["संभावित अपरिभाषित व्यवहार (UB)"]
F["Rust Box / String"] --> G["वैल्यू द्वारा पास (Move)"]
G --> H["ओनरशिप स्थानांतरित"]
H --> I["कंपाइलर पुराने वेरिएबल को ब्लॉक करता है"]
I --> J["मेमोरी सुरक्षा की गारंटी"]&lt;/div>
&lt;h2 id="बरइग-borrowing-और-परवरतनशलत-mutability-क-नयतरण">बॉरोइंग (Borrowing) और परिवर्तनशीलता (Mutability) का नियंत्रण
&lt;/h2>&lt;p>इससे भी अधिक शक्तिशाली संसाधनों को संदर्भित करने वाले &amp;ldquo;बॉरोइंग (Borrowing)&amp;rdquo; के नियम हैं। Rust में निम्नलिखित नियम लागू किए जाते हैं:&lt;/p>
&lt;ol>
&lt;li>किसी भी समय, &amp;ldquo;कई अपरिवर्तनीय संदर्भ (immutable references) (&lt;code>&amp;amp;T&lt;/code>)&amp;rdquo; या &amp;ldquo;एकल परिवर्तनीय संदर्भ (mutable reference) (&lt;code>&amp;amp;mut T&lt;/code>)&amp;rdquo; में से &lt;strong>केवल एक&lt;/strong> ही मौजूद हो सकता है।&lt;/li>
&lt;li>संदर्भ मूल डेटा के स्कोप से अधिक समय तक नहीं रहना चाहिए (लाइफटाइम की बाधाएं)।&lt;/li>
&lt;/ol>
&lt;p>C++ में, आप एक ही ऑब्जेक्ट के लिए आसानी से कई म्यूटबल (परिवर्तनीय) संदर्भ या पॉइंटर्स बना सकते हैं, जिससे अप्रत्याशित अवस्था का विनाश (जैसे इटरेटर का अमान्यकरण) हो सकता है। Rust भाषा के स्तर पर इस &amp;ldquo;अलियासिंग (Aliasing) + म्यूटबिलिटी (Mutability)&amp;rdquo; के संयोजन को प्रतिबंधित करके बग को रोकता है।&lt;/p>
&lt;hr>
&lt;h1 id="2-ममर-लआउट-और-समरट-पइटरस-क-गणतय-ओवरहड">2. मेमोरी लेआउट और स्मार्ट पॉइंटर्स का गणितीय ओवरहेड
&lt;/h1>&lt;p>सिस्टम प्रोग्रामिंग में, मेमोरी लेआउट की सटीक समझ आवश्यक है। आइए C++ के &lt;code>std::shared_ptr&lt;/code> और Rust के &lt;code>std::rc::Rc&lt;/code> / &lt;code>std::sync::Arc&lt;/code> की तुलना करें।&lt;/p>
&lt;p>C++ का &lt;code>std::shared_ptr&lt;/code> संदर्भ गणना (reference counting) द्वारा संसाधनों का प्रबंधन करता है, लेकिन डिफ़ॉल्ट रूप से संदर्भ गणना को बढ़ाने या घटाने के लिए थ्रेड-सेफ एटॉमिक ऑपरेशंस (&lt;code>std::atomic&lt;/code>) का उपयोग करता है। मेमोरी पर इसके ओवरहेड को इस प्रकार सूत्रबद्ध किया जा सकता है:&lt;/p>
$$ Overhead_{C++} = sizeof(T) + sizeof(ControlBlock) $$
&lt;p>यहाँ, $ControlBlock$ में &amp;ldquo;मजबूत संदर्भ काउंटर (Strong Ref Count)&amp;rdquo;, &amp;ldquo;कमजोर संदर्भ काउंटर (Weak Ref Count)&amp;rdquo;, और &amp;ldquo;कस्टम डिलीटर (Custom Deleter)&amp;rdquo; शामिल हैं। समस्या यह है कि सिंगल-थ्रेड का उपयोग करते समय भी, एटॉमिक निर्देशों का ओवरहेड (जैसे कैशलाइन को लॉक करना) बिना किसी शर्त के उत्पन्न होता है।&lt;/p>
&lt;p>इसके विपरीत, Rust स्मार्ट पॉइंटर्स को उपयोग के आधार पर सख्ती से अलग करता है।&lt;/p>
&lt;ul>
&lt;li>&lt;strong>सिंगल-थ्रेड के लिए&lt;/strong>: &lt;code>Rc&amp;lt;T&amp;gt;&lt;/code> (Reference Counted)&lt;/li>
&lt;li>&lt;strong>मल्टी-थ्रेड के लिए&lt;/strong>: &lt;code>Arc&amp;lt;T&amp;gt;&lt;/code> (Atomic Reference Counted)&lt;/li>
&lt;/ul>
$$ Overhead_{Rc} = sizeof(T) + 2 \times sizeof(usize) $$
$$ Overhead_{Arc} = sizeof(T) + 2 \times sizeof(AtomicUsize) $$
&lt;p>Rust में, यदि आप सिंगल-थ्रेड के लिए विशेष रूप से &lt;code>Rc&amp;lt;T&amp;gt;&lt;/code> का उपयोग करते हैं, तो आप एटॉमिक ऑपरेशंस के दंड (penalty) से पूरी तरह बच सकते हैं (ज़ीरो-कॉस्ट एब्स्ट्रैक्शन)। इसके अलावा, थ्रेड सुरक्षा तंत्र (जिसके बारे में बाद में बताया जाएगा) के कारण, गलती से &lt;code>Rc&amp;lt;T&amp;gt;&lt;/code> को किसी अन्य थ्रेड में पास करने से टाइप सिस्टम द्वारा पूरी तरह से बचा जा सकता है।&lt;/p>
&lt;hr>
&lt;h1 id="3-थरड-सरकष-fearless-concurrency-क-परभव">3. थ्रेड सुरक्षा: &amp;ldquo;Fearless Concurrency&amp;rdquo; का प्रभाव
&lt;/h1>&lt;p>C++ में मल्टी-थ्रेडेड प्रोग्रामिंग हमेशा डेटा रेस (data race) और डेडलॉक (deadlock) के डर के साथ होती थी।&lt;/p>
&lt;h2 id="c-क-मयटकस-mutex-और-डट-अलगव-क-खतर">C++ का म्यूटेक्स (Mutex) और डेटा अलगाव का खतरा
&lt;/h2>&lt;p>C++ का &lt;code>std::mutex&lt;/code> केवल &amp;ldquo;विशिष्ट कोड ब्लॉक (क्रिटिकल सेक्शन)&amp;rdquo; को परस्पर अनन्य (mutually exclusive) रूप से नियंत्रित करने के लिए है, और &amp;ldquo;सुरक्षित किए जाने वाले डेटा&amp;rdquo; और &amp;ldquo;म्यूटेक्स&amp;rdquo; के बीच कोई भाषाई संबंध नहीं है।&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;span class="lnt">18
&lt;/span>&lt;span class="lnt">19
&lt;/span>&lt;span class="lnt">20
&lt;/span>&lt;span class="lnt">21
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-cpp" data-lang="cpp">&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#include&lt;/span> &lt;span class="cpf">&amp;lt;iostream&amp;gt;&lt;/span>&lt;span class="cp">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#include&lt;/span> &lt;span class="cpf">&amp;lt;thread&amp;gt;&lt;/span>&lt;span class="cp">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#include&lt;/span> &lt;span class="cpf">&amp;lt;mutex&amp;gt;&lt;/span>&lt;span class="cp">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#include&lt;/span> &lt;span class="cpf">&amp;lt;vector&amp;gt;&lt;/span>&lt;span class="cp">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">vector&lt;/span>&lt;span class="o">&amp;lt;&lt;/span>&lt;span class="kt">int&lt;/span>&lt;span class="o">&amp;gt;&lt;/span> &lt;span class="n">shared_data&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">mutex&lt;/span> &lt;span class="n">mtx&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kt">void&lt;/span> &lt;span class="nf">worker&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// यदि डेवलपर लॉक प्राप्त करना भूल भी जाता है, तो कंपाइलेशन सामान्य रूप से पास हो जाता है
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="c1">// std::lock_guard&amp;lt;std::mutex&amp;gt; lock(mtx);
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="n">shared_data&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">push_back&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">);&lt;/span> &lt;span class="c1">// घातक डेटा रेस!
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kt">int&lt;/span> &lt;span class="nf">main&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="kr">thread&lt;/span> &lt;span class="n">t1&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">worker&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="kr">thread&lt;/span> &lt;span class="n">t2&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">worker&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">t1&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">join&lt;/span>&lt;span class="p">();&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">t2&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">join&lt;/span>&lt;span class="p">();&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h2 id="rust-क-मयटकस-डट-क-ओन-own-करत-ह">Rust का म्यूटेक्स डेटा को &amp;ldquo;ओन (own)&amp;rdquo; करता है
&lt;/h2>&lt;p>Rust में, &lt;code>Mutex&amp;lt;T&amp;gt;&lt;/code> जेनरिक (Generics) का उपयोग करके सुरक्षित किए जाने वाले डेटा प्रकार &lt;code>T&lt;/code> को &lt;strong>सम्मिलित (स्वयं का/own)&lt;/strong> करता है। डेटा तक पहुँचने के लिए, आपको हमेशा &lt;code>lock()&lt;/code> को कॉल करना होगा और एक गार्ड ऑब्जेक्ट प्राप्त करना होगा। लॉक प्राप्त किए बिना डेटा को छूना व्याकरणिक रूप से असंभव है।&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;span class="lnt">18
&lt;/span>&lt;span class="lnt">19
&lt;/span>&lt;span class="lnt">20
&lt;/span>&lt;span class="lnt">21
&lt;/span>&lt;span class="lnt">22
&lt;/span>&lt;span class="lnt">23
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-rust" data-lang="rust">&lt;span class="line">&lt;span class="cl">&lt;span class="k">use&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">std&lt;/span>::&lt;span class="n">sync&lt;/span>::&lt;span class="p">{&lt;/span>&lt;span class="n">Arc&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">Mutex&lt;/span>&lt;span class="p">};&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">use&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">std&lt;/span>::&lt;span class="n">thread&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">fn&lt;/span> &lt;span class="nf">main&lt;/span>&lt;span class="p">()&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">{&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="c1">// डेटा पूरी तरह से म्यूटेक्स (Mutex) के अंदर इनकैप्सुलेटेड (encapsulated) है
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="kd">let&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">shared_data&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">Arc&lt;/span>::&lt;span class="n">new&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">Mutex&lt;/span>::&lt;span class="n">new&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nb">Vec&lt;/span>::&lt;span class="n">new&lt;/span>&lt;span class="p">()));&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="kd">let&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">mut&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">handles&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="fm">vec!&lt;/span>&lt;span class="p">[];&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="k">for&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">_&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">in&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="o">..&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">{&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="c1">// थ्रेड्स के बीच साझा करने के लिए Arc (थ्रेड-सेफ रेफरेंस काउंटिंग) को क्लोन करें
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="kd">let&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">data_clone&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">Arc&lt;/span>::&lt;span class="n">clone&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="o">&amp;amp;&lt;/span>&lt;span class="n">shared_data&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="kd">let&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">handle&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">thread&lt;/span>::&lt;span class="n">spawn&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="k">move&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">||&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">{&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="c1">// यदि आप लॉक प्राप्त नहीं करते हैं, तो आप आंतरिक Vec तक नहीं पहुंच सकते
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="kd">let&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">mut&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">data&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">data_clone&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">lock&lt;/span>&lt;span class="p">().&lt;/span>&lt;span class="n">unwrap&lt;/span>&lt;span class="p">();&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">data&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">push&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="p">});&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">handles&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">push&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">handle&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="p">}&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="k">for&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">handle&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">in&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">handles&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">{&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">handle&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">join&lt;/span>&lt;span class="p">().&lt;/span>&lt;span class="n">unwrap&lt;/span>&lt;span class="p">();&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="p">}&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="p">}&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>इसके अलावा, Rust में समवर्ती प्रसंस्करण (concurrent processing) की सुरक्षा सुनिश्चित करने के लिए दो कोर ट्रेट (Traits) हैं:&lt;/p>
&lt;ul>
&lt;li>&lt;code>Send&lt;/code>: वे प्रकार जिनकी ओनरशिप थ्रेड्स के बीच सुरक्षित रूप से स्थानांतरित की जा सकती है&lt;/li>
&lt;li>&lt;code>Sync&lt;/code>: वे प्रकार जिन्हें एक ही समय में कई थ्रेड्स से संदर्भित करना सुरक्षित है&lt;/li>
&lt;/ul>
&lt;p>उदाहरण के लिए, नॉन-थ्रेड-सेफ &lt;code>Rc&amp;lt;T&amp;gt;&lt;/code> &lt;code>Send&lt;/code> ट्रेट को लागू नहीं करता है। इसलिए, यदि आप इसे &lt;code>thread::spawn&lt;/code> में पास करने का प्रयास करते हैं, तो तत्काल कंपाइल एरर होगा। इस &amp;ldquo;Fearless Concurrency (निडर समवर्ती प्रसंस्करण)&amp;rdquo; के साथ, डेवलपर्स बग के डर से मुक्त हो जाते हैं और समानांतरकरण (parallelization) को अधिक आक्रामकता से आगे बढ़ा सकते हैं।&lt;/p>
&lt;p>अमदाल के नियम (Amdahl&amp;rsquo;s Law) के अनुसार, समानांतर (parallelizable) भाग $P$ और समानांतरता की डिग्री $N$ में अधिकतम सैद्धांतिक थ्रूपुट को इस प्रकार व्यक्त किया जाता है:&lt;/p>
$$ S(N) = \frac{1}{(1 - P) + \frac{P}{N}} $$
&lt;p>Rust इस $P$ को अधिकतम करने के लिए रिफैक्टरिंग को टाइप सिस्टम की सहायता से अत्यधिक सुरक्षित रूप से करने की अनुमति देता है।&lt;/p>
&lt;div class="mermaid">graph TD
A["C++ थ्रेड सुरक्षा"] --> B["डेवलपर की मेमोरी पर निर्भर करता है"]
B --> C["म्यूटेक्स डेटा से अलग"]
C --> D["साइलेंट डेटा रेस का उच्च जोखिम"]
E["Rust थ्रेड सुरक्षा"] --> F["Send और Sync ट्रेट्स"]
F --> G["म्यूटेक्स डेटा को ओन (Own) करता है"]
G --> H["कंपाइल समय पर डेटा रेस को रोका जाता है"]&lt;/div>
&lt;hr>
&lt;h1 id="4-एरर-हडलग-अपवद-exceptions-बनम-बजय-डट-परकर-algebraic-data-types">4. एरर हैंडलिंग: अपवाद (Exceptions) बनाम बीजीय डेटा प्रकार (Algebraic Data Types)
&lt;/h1>&lt;p>C++ में एरर हैंडलिंग का मानक &amp;ldquo;अपवाद (Exceptions)&amp;rdquo; है। हालाँकि, अपवाद कंट्रोल फ्लो (control flow) को अपारदर्शी बनाते हैं और प्रदर्शन दंड (स्टैक अनवाइंडिंग और RTTI की वृद्धि) का कारण बनते हैं। एम्बेडेड सिस्टम और गेम इंजन में, अक्सर अपवादों को पूरी तरह से अक्षम (&lt;code>-fno-exceptions&lt;/code>) किया जाता है और क्लासिक त्रुटि कोड (error codes) वापस करने का डिज़ाइन अपनाया जाता है। C++23 में &lt;code>std::expected&lt;/code> पेश किया गया backwards, लेकिन इसे पूरे इकोसिस्टम में प्रवेश करने में समय लगेगा।&lt;/p>
&lt;p>Rust में अपवाद की कोई अवधारणा नहीं है। त्रुटियों को शुद्ध &amp;ldquo;वैल्यू&amp;rdquo; के रूप में वापस किया जाता है और &lt;code>Result&amp;lt;T, E&amp;gt;&lt;/code> नामक एन्यूमरेशन (बीजीय डेटा प्रकार) द्वारा दर्शाया जाता है।&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-rust" data-lang="rust">&lt;span class="line">&lt;span class="cl">&lt;span class="k">use&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">std&lt;/span>::&lt;span class="n">fs&lt;/span>::&lt;span class="n">File&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">use&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">std&lt;/span>::&lt;span class="n">io&lt;/span>::&lt;span class="p">{&lt;/span>&lt;span class="bp">self&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">Read&lt;/span>&lt;span class="p">};&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">// केवल रिटर्न वैल्यू टाइप को देखकर स्पष्ट हो जाता है कि IO एरर हो सकता है
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">fn&lt;/span> &lt;span class="nf">read_file_content&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">path&lt;/span>: &lt;span class="kp">&amp;amp;&lt;/span>&lt;span class="kt">str&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="w"> &lt;/span>-&amp;gt; &lt;span class="nb">Result&lt;/span>&lt;span class="o">&amp;lt;&lt;/span>&lt;span class="nb">String&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">io&lt;/span>::&lt;span class="n">Error&lt;/span>&lt;span class="o">&amp;gt;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">{&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="c1">// ? ऑपरेटर के साथ, अगर कोई त्रुटि है तो तुरंत अर्ली-रिटर्न (early return), यदि सफल होता है तो सामग्री निकालें
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="kd">let&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">mut&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">file&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">File&lt;/span>::&lt;span class="n">open&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">path&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="o">?&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="kd">let&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">mut&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">content&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">String&lt;/span>::&lt;span class="n">new&lt;/span>&lt;span class="p">();&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">file&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">read_to_string&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="o">&amp;amp;&lt;/span>&lt;span class="k">mut&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">content&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="o">?&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nb">Ok&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">content&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="p">}&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>यह &lt;code>?&lt;/code> ऑपरेटर क्रांतिकारी है। यह C++ में त्रुटि कोड की जांच करते समय उत्पन्न होने वाले गहरे नेस्ट (if स्टेटमेंट का पिरामिड) को समाप्त करता है, अपवादों की तरह एक साफ़ कोड प्रवाह बनाए रखता है, और आपको स्पष्ट रूप से यह वर्णन करने की अनुमति देता है कि कौन से फ़ंक्शन कॉल त्रुटि का प्रचार (propagate) करेंगे।&lt;/p>
&lt;hr>
&lt;h1 id="5-पलमरफजम-वरचअल-फकशनटमपलट-स-टरट-trait-तक">5. पॉलीमॉर्फिज्म: वर्चुअल फ़ंक्शन/टेम्पलेट से ट्रेट (Trait) तक
&lt;/h1>&lt;p>C++ का पॉलीमॉर्फिज्म मुख्य रूप से क्लास इनहेरिटेंस और वर्चुअल फंक्शंस (&lt;code>virtual&lt;/code>) द्वारा डायनेमिक डिस्पैच, या टेम्पलेट्स द्वारा स्टैटिक डिस्पैच (CRTP आदि) से प्राप्त होता है।&lt;/p>
&lt;p>डायनेमिक डिस्पैच में, एक वर्चुअल फ़ंक्शन टेबल (vtable) का पॉइंटर (vptr) ऑब्जेक्ट में एम्बेडेड होता है, और फ़ंक्शन कॉल के समय पॉइंटर रिज़ॉल्यूशन ओवरहेड होता है।&lt;/p>
$$ T_{dispatch} = T_{lookup\_in\_vtable} + T_{dereference} $$
&lt;p>Rust क्लासिकल ऑब्जेक्ट-ओरिएंटेड &amp;ldquo;क्लास इनहेरिटेंस&amp;rdquo; को छोड़ देता है और इसके बजाय &amp;ldquo;&lt;strong>ट्रेट (Traits)&lt;/strong>&amp;rdquo; की अवधारणा को अपनाता है (यह C++20 की Concept के समान है, लेकिन अधिक बहुमुखी है)।&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;span class="lnt">18
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-rust" data-lang="rust">&lt;span class="line">&lt;span class="cl">&lt;span class="k">trait&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">Drawable&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">{&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="k">fn&lt;/span> &lt;span class="nf">draw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="o">&amp;amp;&lt;/span>&lt;span class="bp">self&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="p">}&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">struct&lt;/span> &lt;span class="nc">Circle&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">{&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">radius&lt;/span>: &lt;span class="kt">f64&lt;/span> &lt;span class="p">}&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">impl&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">Drawable&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">for&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">Circle&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">{&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="k">fn&lt;/span> &lt;span class="nf">draw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="o">&amp;amp;&lt;/span>&lt;span class="bp">self&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">{&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="fm">println!&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;Drawing a Circle of radius &lt;/span>&lt;span class="si">{}&lt;/span>&lt;span class="s">&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="bp">self&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">radius&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">}&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="p">}&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">// स्टैटिक डिस्पैच (मोनोमोर्फाइजेशन / शून्य ओवरहेड)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">fn&lt;/span> &lt;span class="nf">draw_static&lt;/span>&lt;span class="o">&amp;lt;&lt;/span>&lt;span class="n">T&lt;/span>: &lt;span class="nc">Drawable&lt;/span>&lt;span class="o">&amp;gt;&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">item&lt;/span>: &lt;span class="kp">&amp;amp;&lt;/span>&lt;span class="nc">T&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">{&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">item&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">draw&lt;/span>&lt;span class="p">();&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="p">}&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">// डायनेमिक डिस्पैच (ट्रेट ऑब्जेक्ट)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">fn&lt;/span> &lt;span class="nf">draw_dynamic&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">item&lt;/span>: &lt;span class="kp">&amp;amp;&lt;/span>&lt;span class="nc">dyn&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">Drawable&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">{&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">item&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">draw&lt;/span>&lt;span class="p">();&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="p">}&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Rust के डायनेमिक डिस्पैच (&lt;code>dyn Trait&lt;/code>) की सबसे बड़ी विशेषता यह है कि यह डेटा संरचना के भीतर vptr नहीं रखता है, बल्कि &lt;strong>फैट पॉइंटर (Fat Pointer)&lt;/strong> का उपयोग करता है। फैट पॉइंटर्स जोड़े (pair) में &amp;ldquo;डेटा का पॉइंटर&amp;rdquo; और &amp;ldquo;vtable का पॉइंटर&amp;rdquo; रखते हैं। यह बाहरी पुस्तकालयों में परिभाषित प्रकारों के लिए बाद में ट्रेट को लागू (विस्तारित) करना और डायनेमिक डिस्पैच करना बहुत आसान बनाता है।&lt;/p>
&lt;hr>
&lt;h1 id="6-पकज-मनजमट-और-बलड-ससटम-cmake-क-सघरष-और-cargo-क-वरदन">6. पैकेज मैनेजमेंट और बिल्ड सिस्टम: CMake का संघर्ष और Cargo का वरदान
&lt;/h1>&lt;p>C++ की सबसे बड़ी कमजोरियों में से एक मानक पैकेज मैनेजर की अनुपस्थिति है। &lt;code>CMakeLists.txt&lt;/code> का गूढ़ सिंटैक्स, &lt;code>find_package&lt;/code> के साथ निर्भरता रिज़ॉल्यूशन की जटिलता, और OS के आधार पर लाइब्रेरी पथों (paths) में अंतर ने C++ इंजीनियरों का बहुत समय बर्बाद किया है।&lt;/p>
&lt;p>Rust में &lt;strong>Cargo&lt;/strong> नामक दुनिया का सबसे अच्छा पैकेज मैनेजर और बिल्ड सिस्टम मानक के रूप में शामिल है।&lt;/p>
&lt;div class="mermaid">graph TD
A["C++ बिल्ड एनवायरनमेंट"] --> B["CMakeLists.txt"]
B --> C["vcpkg / Conan इंटीग्रेशन"]
C --> D["Makefiles / Ninja जनरेट करें"]
D --> E["कंपाइलर (GCC/Clang/MSVC)"]
F["Rust बिल्ड एनवायरनमेंट"] --> G["Cargo.toml"]
G --> H["crates.io से निर्भरताएँ प्राप्त करें"]
H --> I["rustc (Cargo बिल्ड)"]
I --> J["रन करने के लिए तैयार बाइनरी (Binary)"]&lt;/div>
&lt;p>&lt;code>Cargo.toml&lt;/code> में बस एक लाइन में निर्भरता लाइब्रेरी (Crate) का नाम और संस्करण जोड़कर, ट्रांजिटिव (transitive) निर्भरता का समाधान, डाउनलोड और निर्माण सब स्वचालित रूप से किया जाता है। इसके अलावा, परीक्षण (&lt;code>cargo test&lt;/code>), दस्तावेज़ जनरेशन (&lt;code>cargo doc&lt;/code>), स्टेटिक विश्लेषण (&lt;code>cargo clippy&lt;/code>), और फ़ॉर्मेटर (&lt;code>cargo fmt&lt;/code>) जैसे विकास के लिए आवश्यक सभी टूलचेन इस एकल कमांड में एकीकृत हैं। यह आराम इतना जबरदस्त है कि एक बार इसे अनुभव करने के बाद, आप कभी भी C++ बिल्ड वातावरण में वापस नहीं जाना चाहेंगे।&lt;/p>
&lt;hr>
&lt;h1 id="7-rust-सखन-क-नकसन-और-लरनग-करव-learning-curve">7. Rust सीखने के नुकसान और लर्निंग कर्व (Learning Curve)
&lt;/h1>&lt;p>अब तक मैंने Rust के फायदों के बारे में बात की है, लेकिन कुछ &amp;ldquo;दीवारें&amp;rdquo; और नुकसान भी हैं जिनका सामना C++ इंजीनियरों को Rust को व्यावहारिक उपयोग में लाते समय करना पड़ता है।&lt;/p>
&lt;h2 id="1-कठर-बर-चकर-borrow-checker-क-सथ-सघरष">1. कठोर बॉरो चेकर (Borrow Checker) के साथ संघर्ष
&lt;/h2>&lt;p>यदि आप C++ में डेटा स्ट्रक्चर्स (जैसे कि डबली-लिंक्ड लिस्ट्स, ग्राफ स्ट्रक्चर्स, सेल्फ-रेफरेंशियल स्ट्रक्चर्स आदि) जिन्हें आपने &amp;ldquo;किसी तरह रॉ पॉइंटर्स (raw pointers) के साथ जोड़ा था&amp;rdquo; को सीधे Rust में लागू करने का प्रयास करते हैं, तो ओनरशिप और लाइफटाइम बाधाओं के कारण कंपाइलेशन पास नहीं होगा। बॉरो चेकर को संतुष्ट करने के लिए, आपको या तो &lt;code>Rc&amp;lt;RefCell&amp;lt;T&amp;gt;&amp;gt;&lt;/code> जैसी जटिल रैपिंग करनी होगी, या एरिना एलोकेटर (arena allocator) या इंडेक्स-आधारित प्रबंधन का उपयोग करने के लिए डिज़ाइन पर मौलिक रूप से पुनर्विचार करना होगा।&lt;/p>
&lt;h2 id="2-लब-समय-तक-कपइलशन-compilation-time">2. लंबे समय तक कंपाइलेशन (Compilation Time)
&lt;/h2>&lt;p>C++ में टेम्पलेट्स की नेस्टिंग के कारण भी कंपाइलेशन धीमा हो जाता है, लेकिन Rust का कंपाइलेशन समय (विशेष रूप से खरोंच से क्लीन बिल्ड) भी कम नहीं है। LLVM के शक्तिशाली ऑप्टिमाइजेशन पास, मैक्रोज़ का विस्तार, और जेनरिक के मोनोमोर्फाइजेशन (Monomorphization) के ओवरलैप होने के कारण, बड़े पैमाने के प्रोजेक्ट्स में बिल्ड समय एक बाधा बन जाता है। विकास के दौरान &lt;code>cargo check&lt;/code> का भारी उपयोग करना जैसी तकनीकें आवश्यक हैं।&lt;/p>
&lt;h2 id="3-c-कडबस-क-सथ-इटरऑपरबलट-interoperability">3. C++ कोडबेस के साथ इंटरऑपरेबिलिटी (Interoperability)
&lt;/h2>&lt;p>C भाषा (FFI) के साथ एकीकरण बहुत सुचारू है, लेकिन Rust को सीधे मौजूदा विशाल C++ कोडबेस (जो क्लास, टेम्पलेट्स, वर्चुअल फ़ंक्शंस का भारी उपयोग करते हैं) के साथ एकीकृत करना बहुत मुश्किल है। हाल के वर्षों में, &lt;code>cxx&lt;/code> और &lt;code>autocxx&lt;/code> जैसे ब्रिजिंग टूल विकसित हुए हैं, लेकिन पूर्ण सीमलेस (seamless) माइग्रेशन के लिए अभी भी उच्च बाधाएँ हैं।&lt;/p>
&lt;hr>
&lt;h1 id="नषकरष-कय-हम-rust-क-ओर-रख-करन-चहए">निष्कर्ष: क्या हमें Rust की ओर रुख करना चाहिए?
&lt;/h1>&lt;p>C++ भविष्य में भी गेम इंजन डेवलपमेंट और मौजूदा बड़े इन्फ्रास्ट्रक्चर में महत्वपूर्ण भूमिका निभाता रहेगा। C++20/23 के साथ आधुनिकीकरण भी उल्लेखनीय है, और इसे अधिक सुरक्षित रूप से लिखा जा सकता है।&lt;/p>
&lt;p>हालाँकि, &amp;ldquo;नए शुरू किए जा रहे सिस्टम प्रोग्रामिंग प्रोजेक्ट्स&amp;rdquo; के लिए, मुझे लगता है कि &lt;strong>Rust को नहीं चुनने का कारण खोजना अब अधिक कठिन है&lt;/strong>। एक बार कंपाइल हो जाने पर, अपरिभाषित व्यवहार (undefined behavior) और मेमोरी करप्शन के डर से मुक्ति, और उच्च प्रदर्शन के साथ सुरक्षित रूप से समवर्ती रूप से प्रोसेस करने में सक्षम होने की Rust की &amp;ldquo;निश्चितता&amp;rdquo; इंजीनियर के मानसिक मॉडल (mental model) में नाटकीय रूप से सुधार करती है।&lt;/p>
&lt;p>C++ इंजीनियरों के लिए, Rust सीखना केवल एक नया सिंटैक्स सीखना नहीं है, बल्कि &amp;ldquo;मेमोरी और थ्रेड्स को सुरक्षित रूप से प्रबंधित करने&amp;rdquo; पर एक नया दृष्टिकोण प्राप्त करने का सबसे अच्छा अनुभव है। मैं आप सभी को Cargo की सुविधा और बॉरो चेकर की सख्ती का अनुभव करने के लिए प्रोत्साहित करता हूँ।&lt;/p></description></item></channel></rss>