<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Divyesh Kakadiya</title>
    <description>The latest articles on DEV Community by Divyesh Kakadiya (@divyesh_kakadiya).</description>
    <link>https://dev.to/divyesh_kakadiya</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3821525%2F1d149eaf-9a68-4242-a90c-159ce847ff11.png</url>
      <title>DEV Community: Divyesh Kakadiya</title>
      <link>https://dev.to/divyesh_kakadiya</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/divyesh_kakadiya"/>
    <language>en</language>
    <item>
      <title>How Rust's Ownership Model Prevents Bugs — A Visual Guide</title>
      <dc:creator>Divyesh Kakadiya</dc:creator>
      <pubDate>Wed, 01 Apr 2026 08:23:18 +0000</pubDate>
      <link>https://dev.to/divyesh_kakadiya/how-rusts-ownership-model-prevents-bugs-a-visual-guide-2epp</link>
      <guid>https://dev.to/divyesh_kakadiya/how-rusts-ownership-model-prevents-bugs-a-visual-guide-2epp</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;No segfaults. No data races. No garbage collector. Here's the idea behind Rust's most powerful feature — with diagrams that make it click.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fukpewtiz8a5ssdzs2fz5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fukpewtiz8a5ssdzs2fz5.png" alt=" " width="800" height="418"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You've probably heard that Rust is &lt;strong&gt;memory-safe&lt;/strong&gt; — that it doesn't crash with segfaults or silently corrupt data like C can. But &lt;em&gt;how&lt;/em&gt; does it do that without a garbage collector slowing things down?&lt;/p&gt;

&lt;p&gt;The answer is &lt;strong&gt;ownership&lt;/strong&gt; — three simple rules the compiler checks before your code even runs. Break a rule and it won't compile. The bug never runs. It never ships.&lt;/p&gt;

&lt;p&gt;By the end of this post you'll understand all three rules with real diagrams and code. No systems programming background needed.&lt;/p&gt;




&lt;h2&gt;
  
  
  Three rules — that's the whole model
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Step&lt;/th&gt;
&lt;th&gt;Rule&lt;/th&gt;
&lt;th&gt;What it prevents&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;One Owner&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;No duplicates&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Borrow Rules&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Read or write, never both&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Auto Drop&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;No leaks&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  ⚠ The problem every other language has
&lt;/h2&gt;

&lt;p&gt;In C, C++, and even some higher-level languages, you can create &lt;strong&gt;as many pointers or references to the same data as you want&lt;/strong&gt; — with no rules about who's responsible for it. That freedom causes three brutal bug families:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fj29u9blzxwih8u7vbra4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fj29u9blzxwih8u7vbra4.png" alt=" " width="800" height="322"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Three bug families — all caused by uncontrolled references to the same memory&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;🔥 &lt;strong&gt;The real cost&lt;/strong&gt; — These bugs don't just crash. They cause &lt;strong&gt;silent data corruption&lt;/strong&gt;, &lt;strong&gt;security vulnerabilities&lt;/strong&gt;, and bugs that only appear once a month in production. The Microsoft Security Response Center found that ~70% of CVEs they patch every year are memory safety issues.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Rust's answer: &lt;strong&gt;make these bug patterns structurally impossible to write&lt;/strong&gt;. Not just hard — impossible. The compiler rejects them.&lt;/p&gt;




&lt;h2&gt;
  
  
  Rule 1: Every value has exactly one owner
&lt;/h2&gt;

&lt;p&gt;Imagine a physical key to a storage unit. There's only one key. If you give it to someone, you no longer have it — they have it. You can't use a key you don't hold.&lt;/p&gt;

&lt;p&gt;Rust works the same way with data. Every value has exactly one variable that "owns" it. When you assign a value to another variable, ownership &lt;em&gt;moves&lt;/em&gt;. The original variable becomes invalid.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvzm4qpt0eu1gn2nnytg5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvzm4qpt0eu1gn2nnytg5.png" alt=" " width="800" height="344"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Ownership moves like a physical object — only one variable holds it at a time&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;s1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;String&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;from&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"hello"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;   &lt;span class="c1"&gt;// s1 owns the string&lt;/span&gt;
&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;s2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;s1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;                       &lt;span class="c1"&gt;// ownership MOVES to s2&lt;/span&gt;
&lt;span class="c1"&gt;// s1 is now dead — try to use it and:&lt;/span&gt;
&lt;span class="nd"&gt;println!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"{}"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;s1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;  &lt;span class="c1"&gt;// ❌ error[E0382]: borrow of moved value: `s1`&lt;/span&gt;
&lt;span class="c1"&gt;// s2 works fine:&lt;/span&gt;
&lt;span class="nd"&gt;println!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"{}"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;s2&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;  &lt;span class="c1"&gt;// ✅ prints "hello"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;💡 &lt;strong&gt;What this prevents&lt;/strong&gt; — Use-after-free bugs become &lt;strong&gt;literally uncompilable&lt;/strong&gt;. You can't use a value after it's been moved — the compiler won't let you. No runtime check, no crash — it fails at build time.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;What about integers?&lt;/strong&gt; Simple types like &lt;code&gt;i32&lt;/code&gt;, &lt;code&gt;bool&lt;/code&gt;, and &lt;code&gt;f64&lt;/code&gt; implement the &lt;code&gt;Copy&lt;/code&gt; trait — they're so small that copying them is cheaper than tracking ownership. The move rule applies to &lt;strong&gt;heap-allocated types&lt;/strong&gt; like &lt;code&gt;String&lt;/code&gt;, &lt;code&gt;Vec&lt;/code&gt;, and &lt;code&gt;Box&lt;/code&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Rule 2: Borrow rules — reading or writing, never both
&lt;/h2&gt;

&lt;p&gt;Most of the time you don't want to transfer ownership — you just want to let a function &lt;em&gt;use&lt;/em&gt; your data temporarily. That's called &lt;strong&gt;borrowing&lt;/strong&gt;. You pass a reference (&lt;code&gt;&amp;amp;&lt;/code&gt;) instead of the value itself.&lt;/p&gt;

&lt;p&gt;There are two kinds of borrows, and the rule between them is strict:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff3596n8d44xllkebniim.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff3596n8d44xllkebniim.png" alt=" " width="800" height="300"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;You can have many readers OR one writer — never both at the same time&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Shared borrow &lt;code&gt;&amp;amp;T&lt;/code&gt; — read only, unlimited count
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;print_length&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="nb"&gt;String&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;         &lt;span class="c1"&gt;// borrows s, doesn't own it&lt;/span&gt;
    &lt;span class="nd"&gt;println!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Length: {}"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="nf"&gt;.len&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;String&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;from&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"hello"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nf"&gt;print_length&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;  &lt;span class="c1"&gt;// pass a reference — s is lent, not moved&lt;/span&gt;
&lt;span class="nd"&gt;println!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"{}"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;  &lt;span class="c1"&gt;// ✅ s still works — we only borrowed it&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Mutable borrow &lt;code&gt;&amp;amp;mut T&lt;/code&gt; — one writer, exclusive
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;shout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="k"&gt;mut&lt;/span&gt; &lt;span class="nb"&gt;String&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="nf"&gt;.push_str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"!!!"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;                &lt;span class="c1"&gt;// we can modify it&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="k"&gt;mut&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;String&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;from&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"hello"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nf"&gt;shout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="k"&gt;mut&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nd"&gt;println!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"{}"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;  &lt;span class="c1"&gt;// ✅ "hello!!!"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  The rule you cannot break
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="k"&gt;mut&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;String&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;from&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"hello"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;r1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;      &lt;span class="c1"&gt;// ✅ shared borrow #1&lt;/span&gt;
&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;r2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;      &lt;span class="c1"&gt;// ✅ shared borrow #2 — still fine&lt;/span&gt;
&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;r3&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="k"&gt;mut&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  &lt;span class="c1"&gt;// ❌ error: cannot borrow `s` as mutable&lt;/span&gt;
                  &lt;span class="c1"&gt;//          because it is also borrowed as immutable&lt;/span&gt;
&lt;span class="nd"&gt;println!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"{} {} {}"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;r1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;r2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;r3&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Borrow rules summary
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;What you do&lt;/th&gt;
&lt;th&gt;Allowed?&lt;/th&gt;
&lt;th&gt;Why&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Many &lt;code&gt;&amp;amp;&lt;/code&gt; borrows at once&lt;/td&gt;
&lt;td&gt;✅ Valid&lt;/td&gt;
&lt;td&gt;Readers don't interfere — safe in parallel&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;One &lt;code&gt;&amp;amp;mut&lt;/code&gt; borrow alone&lt;/td&gt;
&lt;td&gt;✅ Valid&lt;/td&gt;
&lt;td&gt;Exclusive write with no readers — safe&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;&amp;amp;&lt;/code&gt; and &lt;code&gt;&amp;amp;mut&lt;/code&gt; at the same time&lt;/td&gt;
&lt;td&gt;❌ Blocked&lt;/td&gt;
&lt;td&gt;Reader could see half-modified state&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Two &lt;code&gt;&amp;amp;mut&lt;/code&gt; at the same time&lt;/td&gt;
&lt;td&gt;❌ Blocked&lt;/td&gt;
&lt;td&gt;Both writers conflict — unpredictable&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;💡 &lt;strong&gt;Why this kills data races&lt;/strong&gt; — A data race needs &lt;strong&gt;two concurrent accesses where at least one is a write&lt;/strong&gt;. Rust's borrow rules make this &lt;strong&gt;structurally impossible&lt;/strong&gt; — the compiler enforces it even across threads. You get concurrency safety for free, without writing a single mutex.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Rule 3: Values drop automatically at the end of scope
&lt;/h2&gt;

&lt;p&gt;No &lt;code&gt;free()&lt;/code&gt;. No &lt;code&gt;delete&lt;/code&gt;. No garbage collector pausing your program. When the variable that &lt;em&gt;owns&lt;/em&gt; data reaches the closing &lt;code&gt;}&lt;/code&gt; of its block, Rust automatically calls &lt;code&gt;drop()&lt;/code&gt; and frees the memory.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvlakryqmcb8aeayfhhnn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvlakryqmcb8aeayfhhnn.png" alt=" " width="800" height="255"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Rust inserts drop() automatically — zero runtime overhead, guaranteed cleanup&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;String&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;from&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"hello"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;  &lt;span class="c1"&gt;// heap allocated here&lt;/span&gt;
    &lt;span class="nd"&gt;println!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"{}"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;               &lt;span class="c1"&gt;// works fine&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;  &lt;span class="c1"&gt;// ← drop(s) is inserted here by the compiler. Memory freed.&lt;/span&gt;
&lt;span class="c1"&gt;// s doesn't exist anymore — can't use it even if you tried&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;💡 &lt;strong&gt;Two bugs killed at once&lt;/strong&gt; — This prevents both &lt;strong&gt;memory leaks&lt;/strong&gt; (forgetting to free) and &lt;strong&gt;double-free errors&lt;/strong&gt; (freeing twice). Only the owner can drop, and since there's only ever one owner, it drops exactly once.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  ⚡ C vs Rust: the same bug, two outcomes
&lt;/h2&gt;

&lt;p&gt;Here's the most common memory bug — accessing data after it's been freed. Same logic, completely different results:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;C — compiles. Ships. Crashes in production.&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight c"&gt;&lt;code&gt;&lt;span class="kt"&gt;char&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;malloc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;strcpy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"hello"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;free&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;  &lt;span class="c1"&gt;// memory freed&lt;/span&gt;
&lt;span class="n"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"%s&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="c1"&gt;// 💥 undefined behaviour&lt;/span&gt;
&lt;span class="c1"&gt;// crash / garbage / silent corruption — no warning&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Rust — rejected at compile time.&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;String&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;from&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"hello"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;s2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  &lt;span class="c1"&gt;// s moved&lt;/span&gt;
&lt;span class="c1"&gt;// s2 owns it now:&lt;/span&gt;
&lt;span class="nd"&gt;println!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"{}"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="c1"&gt;// ❌ error[E0382]&lt;/span&gt;
&lt;span class="c1"&gt;// borrow of moved value&lt;/span&gt;
&lt;span class="c1"&gt;// → fix it NOW, before ship&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;⚡ &lt;strong&gt;The key insight&lt;/strong&gt; — In C the bug compiles, ships, and explodes at 2am in production. In Rust the same bug is a &lt;strong&gt;line 5 compiler error&lt;/strong&gt; on your laptop. You fix it before it ever runs.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Bonus: references can't outlive their data
&lt;/h2&gt;

&lt;p&gt;There's one more thing the borrow checker enforces automatically. A reference can &lt;strong&gt;never outlive&lt;/strong&gt; the data it points to. Try to return a reference to local data and Rust stops you:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="c1"&gt;// ❌ This function tries to return a reference to local data&lt;/span&gt;
&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;dangle&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="nb"&gt;String&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;String&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;from&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"hello"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;  &lt;span class="c1"&gt;// ❌ s is about to be dropped — this reference would dangle!&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;   &lt;span class="c1"&gt;// s dropped here, reference becomes invalid&lt;/span&gt;

&lt;span class="c1"&gt;// ✅ The fix: return ownership, not a reference&lt;/span&gt;
&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;no_dangle&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;String&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;String&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;from&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"hello"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;s&lt;/span&gt;  &lt;span class="c1"&gt;// ✅ ownership moves out — data lives on&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  📋 The three rules — one final time
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Rule 1: Every value has exactly one owner&lt;/strong&gt;&lt;br&gt;
Moving a value to another variable invalidates the original. Only one variable can hold a heap value at a time. This kills use-after-free and double-free bugs permanently.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Rule 2: Borrow with rules — many readers OR one writer&lt;/strong&gt;&lt;br&gt;
You can lend data via &lt;code&gt;&amp;amp;&lt;/code&gt; (read-only, many allowed) or &lt;code&gt;&amp;amp;mut&lt;/code&gt; (read-write, exclusive). Never both at once. This makes data races impossible — even across threads.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Rule 3: Values drop when their owner leaves scope&lt;/strong&gt;&lt;br&gt;
Rust inserts &lt;code&gt;drop()&lt;/code&gt; automatically at the closing brace — no manual memory management, no GC. One owner means one drop — no leaks, no double-free.&lt;/p&gt;




&lt;p&gt;That's it. &lt;strong&gt;Three rules, zero memory bugs, zero runtime cost.&lt;/strong&gt; The borrow checker feels strict at first — but every error it shows you is a real bug it's preventing. Once you stop fighting it and start reading its messages, it becomes the best pair-programmer you've ever had.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;🦀 &lt;strong&gt;What beginners should expect&lt;/strong&gt; — The borrow checker will reject code that compiles fine in other languages. This is disorienting for the first few weeks. Push through it. The moment it "clicks" — usually around week 3 — you'll start writing better code in &lt;em&gt;every&lt;/em&gt; language, because you'll think about ownership and aliasing everywhere.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;em&gt;If this helped, share it with someone learning Rust — it's the explanation I wish existed when I started. 🦀&lt;/em&gt;&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>programming</category>
      <category>rust</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Zero-Cost Abstractions in Rust — What It Really Means</title>
      <dc:creator>Divyesh Kakadiya</dc:creator>
      <pubDate>Thu, 26 Mar 2026 04:50:08 +0000</pubDate>
      <link>https://dev.to/divyesh_kakadiya/zero-cost-abstractions-in-rust-what-it-really-means-klk</link>
      <guid>https://dev.to/divyesh_kakadiya/zero-cost-abstractions-in-rust-what-it-really-means-klk</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;“What you don’t use, you don’t pay for. And what you do use, you couldn’t hand-code better.”&lt;/em&gt; — Bjarne Stroustrup&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  The Philosophy at the Core
&lt;/h2&gt;

&lt;p&gt;When Bjarne Stroustrup coined the term &lt;strong&gt;zero-cost abstractions&lt;/strong&gt; for C++, he meant two things:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You don’t pay for what you don’t use&lt;/li&gt;
&lt;li&gt;You can’t do better by hand&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Rust takes that philosophy and turns it into a &lt;strong&gt;guarantee&lt;/strong&gt;, not just an aspiration. It’s baked into the design of the language itself.&lt;/p&gt;

&lt;p&gt;But what does that actually mean in practice?&lt;/p&gt;

&lt;p&gt;Most explanations stop at &lt;em&gt;“the compiler is smart.”&lt;/em&gt; That’s not enough. Let’s break it down — from source code to machine code.&lt;/p&gt;




&lt;h2&gt;
  
  
  What “Zero-Cost” Actually Means
&lt;/h2&gt;

&lt;p&gt;Let’s clarify what zero-cost abstractions &lt;strong&gt;do NOT mean&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Your program runs instantly&lt;/li&gt;
&lt;li&gt;You never need to think about performance&lt;/li&gt;
&lt;li&gt;All Rust code is automatically fast&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;What it &lt;strong&gt;does mean&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The abstraction mechanism adds &lt;strong&gt;no runtime overhead&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Iterators compile to the same code as manual loops&lt;/li&gt;
&lt;li&gt;Generics compile to specialized versions (no dynamic cost)&lt;/li&gt;
&lt;li&gt;Closures compile to inline logic&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The cost exists at &lt;strong&gt;compile time&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Longer builds&lt;/li&gt;
&lt;li&gt;Larger binaries (due to monomorphization)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;At runtime? &lt;strong&gt;Zero tax.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Iterators vs Loops — The Classic Example
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Manual loop
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;sum_squares_loop&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;i64&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="k"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;i64&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="k"&gt;mut&lt;/span&gt; &lt;span class="n"&gt;total&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="k"&gt;mut&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="nf"&gt;.len&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;total&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="n"&gt;total&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Iterator version
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;sum_squares_iter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;i64&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="k"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;i64&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;data&lt;/span&gt;
        &lt;span class="nf"&gt;.iter&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="nf"&gt;.filter&lt;/span&gt;&lt;span class="p"&gt;(|&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="nf"&gt;.map&lt;/span&gt;&lt;span class="p"&gt;(|&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="nf"&gt;.sum&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The iterator version reads like English:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Filter even numbers → square them → sum the results.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Why it's just as fast (or faster)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;1. Bounds-check elimination&lt;/strong&gt;&lt;br&gt;
The compiler can prove accesses are safe and removes checks entirely.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Loop fusion&lt;/strong&gt;&lt;br&gt;
&lt;code&gt;.filter()&lt;/code&gt;, &lt;code&gt;.map()&lt;/code&gt;, &lt;code&gt;.sum()&lt;/code&gt; → &lt;strong&gt;one loop&lt;/strong&gt;, not three.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Auto-vectorization&lt;/strong&gt;&lt;br&gt;
The compiler may use SIMD instructions automatically.&lt;/p&gt;




&lt;h2&gt;
  
  
  What the Compiler Actually Does
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Stage 1: Source code
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="nf"&gt;.iter&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="nf"&gt;.filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="nf"&gt;.map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="nf"&gt;.sum&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Stage 2: MIR (Mid-level IR)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Iterators become state machines&lt;/li&gt;
&lt;li&gt;No heap allocations&lt;/li&gt;
&lt;li&gt;Everything gets inlined&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Stage 3: LLVM optimizations
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Functions + closures inlined&lt;/li&gt;
&lt;li&gt;Operations fused into a single loop&lt;/li&gt;
&lt;li&gt;Bounds checks removed&lt;/li&gt;
&lt;li&gt;SIMD applied where possible&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Stage 4: Assembly
&lt;/h3&gt;

&lt;p&gt;What remains is highly optimized machine code — often processing multiple values at once.&lt;/p&gt;




&lt;h2&gt;
  
  
  Generics: Monomorphization
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="n"&gt;largest&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;PartialOrd&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;list&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="k"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="k"&gt;mut&lt;/span&gt; &lt;span class="n"&gt;largest&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;list&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;list&lt;/span&gt;&lt;span class="nf"&gt;.iter&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;largest&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;largest&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="n"&gt;largest&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  What actually happens:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="nf"&gt;largest&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;3_i32&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;  &lt;span class="c1"&gt;// generates largest_i32&lt;/span&gt;
&lt;span class="nf"&gt;largest&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;3.1_f64&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;1.0&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;    &lt;span class="c1"&gt;// generates largest_f64&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each type gets its &lt;strong&gt;own specialized version&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Result:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;No virtual dispatch&lt;/li&gt;
&lt;li&gt;No runtime overhead&lt;/li&gt;
&lt;li&gt;Same performance as handwritten code&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Tradeoff:&lt;/strong&gt; larger binaries, longer compile times.&lt;/p&gt;




&lt;h2&gt;
  
  
  Traits: Static vs Dynamic Dispatch
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;trait&lt;/span&gt; &lt;span class="n"&gt;Drawable&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;draw&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="k"&gt;self&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Static dispatch (zero-cost)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="n"&gt;render_static&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Drawable&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;shape&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;shape&lt;/span&gt;&lt;span class="nf"&gt;.draw&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Fully known at compile time&lt;/li&gt;
&lt;li&gt;Inlined&lt;/li&gt;
&lt;li&gt;No vtable&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Dynamic dispatch (runtime cost)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;render_dynamic&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;shape&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="k"&gt;dyn&lt;/span&gt; &lt;span class="n"&gt;Drawable&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;shape&lt;/span&gt;&lt;span class="nf"&gt;.draw&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Uses vtable lookup&lt;/li&gt;
&lt;li&gt;~3–5ns overhead per call&lt;/li&gt;
&lt;li&gt;Cannot be inlined&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 In Rust, &lt;strong&gt;dynamic dispatch is always explicit&lt;/strong&gt; (&lt;code&gt;dyn Trait&lt;/code&gt;).&lt;/p&gt;




&lt;h2&gt;
  
  
  Real-World Example
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;process_logs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;raw&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;HashMap&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nb"&gt;String&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;usize&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;raw&lt;/span&gt;
        &lt;span class="nf"&gt;.lines&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="nf"&gt;.filter&lt;/span&gt;&lt;span class="p"&gt;(|&lt;/span&gt;&lt;span class="n"&gt;l&lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="n"&gt;l&lt;/span&gt;&lt;span class="nf"&gt;.contains&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"ERROR"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
        &lt;span class="nf"&gt;.filter_map&lt;/span&gt;&lt;span class="p"&gt;(|&lt;/span&gt;&lt;span class="n"&gt;l&lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="nf"&gt;parse_service&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;l&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
        &lt;span class="nf"&gt;.fold&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nn"&gt;HashMap&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="k"&gt;mut&lt;/span&gt; &lt;span class="n"&gt;acc&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;service&lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;acc&lt;/span&gt;&lt;span class="nf"&gt;.entry&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;service&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="nf"&gt;.or_insert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="n"&gt;acc&lt;/span&gt;
        &lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  What this gives you:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Single pass over data&lt;/li&gt;
&lt;li&gt;No intermediate allocations&lt;/li&gt;
&lt;li&gt;No extra memory overhead&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Readable AND fast.&lt;/p&gt;




&lt;h2&gt;
  
  
  Performance Summary
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Task&lt;/th&gt;
&lt;th&gt;Approach&lt;/th&gt;
&lt;th&gt;Performance&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Sum of squares&lt;/td&gt;
&lt;td&gt;Iterators&lt;/td&gt;
&lt;td&gt;Same as loop&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Filter + map&lt;/td&gt;
&lt;td&gt;Iterators&lt;/td&gt;
&lt;td&gt;Same or faster&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Generics&lt;/td&gt;
&lt;td&gt;Monomorphized&lt;/td&gt;
&lt;td&gt;Same&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Dynamic dispatch&lt;/td&gt;
&lt;td&gt;&lt;code&gt;dyn Trait&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Small overhead&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Where You Can Still Go Wrong
&lt;/h2&gt;

&lt;p&gt;Zero-cost abstractions don’t mean zero thinking.&lt;/p&gt;

&lt;h3&gt;
  
  
  Common pitfalls:
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;1. &lt;code&gt;clone()&lt;/code&gt; in hot loops&lt;/strong&gt;&lt;br&gt;
→ Each call may allocate&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. &lt;code&gt;.collect()&lt;/code&gt; mid-chain&lt;/strong&gt;&lt;br&gt;
→ Breaks fusion + allocates memory&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. &lt;code&gt;Box&amp;lt;dyn Trait&amp;gt;&lt;/code&gt; in hot paths&lt;/strong&gt;&lt;br&gt;
→ Heap allocation + dynamic dispatch&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Large values copied repeatedly&lt;/strong&gt;&lt;br&gt;
→ Prefer references or &lt;code&gt;Arc&amp;lt;T&amp;gt;&lt;/code&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  How This Changes Your Coding Style
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Prefer clarity first
&lt;/h3&gt;

&lt;p&gt;Readable iterator chains are usually &lt;strong&gt;also the fastest&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Trust the compiler
&lt;/h3&gt;

&lt;p&gt;Don’t assume loops are faster — &lt;strong&gt;measure first&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Make costs explicit
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;dyn Trait&lt;/code&gt; → runtime cost&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Box&lt;/code&gt;, &lt;code&gt;Vec&lt;/code&gt; → allocation&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  4. Embrace iterator chains
&lt;/h3&gt;

&lt;p&gt;They give the compiler more optimization opportunities.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Bigger Picture
&lt;/h2&gt;

&lt;p&gt;Zero-cost abstractions are more than a performance feature.&lt;/p&gt;

&lt;p&gt;They represent a shift in how we think about programming:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;You shouldn’t have to choose between &lt;strong&gt;readability&lt;/strong&gt; and &lt;strong&gt;performance&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Rust proves you can have both.&lt;/p&gt;




&lt;h2&gt;
  
  
  Key Takeaways
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Prefer iterators over loops — clearer and just as fast&lt;/li&gt;
&lt;li&gt;Use generics and &lt;code&gt;impl Trait&lt;/code&gt; by default (static dispatch = free)&lt;/li&gt;
&lt;li&gt;Closures are inlined — no overhead&lt;/li&gt;
&lt;li&gt;Avoid unnecessary &lt;code&gt;.collect()&lt;/code&gt; calls&lt;/li&gt;
&lt;li&gt;Profile before optimizing&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Final Thought
&lt;/h2&gt;

&lt;p&gt;Rust’s biggest promise isn’t just memory safety.&lt;/p&gt;

&lt;p&gt;It’s this:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;High-level code that compiles down to low-level performance — without compromise.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>rust</category>
      <category>performance</category>
      <category>webdev</category>
      <category>zerocostabstraction</category>
    </item>
  </channel>
</rss>
