<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>5 不安全的单向链表队列 on 编程那些事儿</title><link>https://before80.github.io/prgms/Rust/tooManyLists/unsafeQueue/</link><description>Recent content in 5 不安全的单向链表队列 on 编程那些事儿</description><generator>Hugo</generator><language>zh-cn</language><lastBuildDate>Sun, 23 Aug 2026 21:05:58 +0800</lastBuildDate><atom:link href="https://before80.github.io/prgms/Rust/tooManyLists/unsafeQueue/index.xml" rel="self" type="application/rss+xml"/><item><title>5.1 数据布局</title><link>https://before80.github.io/prgms/Rust/tooManyLists/unsafeQueue/5.1-layout/</link><pubDate>Sun, 23 Aug 2026 16:06:00 +0800</pubDate><guid>https://before80.github.io/prgms/Rust/tooManyLists/unsafeQueue/5.1-layout/</guid><description>&lt;blockquote&gt;
&lt;p&gt;原文链接: &lt;a href="https://rust-unofficial.github.io/too-many-lists/fifth-layout.html"&gt;https://rust-unofficial.github.io/too-many-lists/fifth-layout.html&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;单链表队列是什么样的？当我们有单链表栈时，我们从链表一端压入，再从同一端弹出。栈和队列的唯一区别是队列从&lt;em&gt;另一端&lt;/em&gt;弹出。所以从我们的栈实现我们有：&lt;/p&gt;</description></item><item><title>5.2 Unsafe</title><link>https://before80.github.io/prgms/Rust/tooManyLists/unsafeQueue/5.2-unsafe/</link><pubDate>Sun, 23 Aug 2026 16:06:00 +0800</pubDate><guid>https://before80.github.io/prgms/Rust/tooManyLists/unsafeQueue/5.2-unsafe/</guid><description>&lt;blockquote&gt;
&lt;p&gt;原文链接: &lt;a href="https://rust-unofficial.github.io/too-many-lists/fifth-unsafe.html"&gt;https://rust-unofficial.github.io/too-many-lists/fifth-unsafe.html&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;这是一个严肃、庞大、复杂且危险的话题。严肃到我为此写了&lt;a href="https://doc.rust-lang.org/nightly/nomicon/"&gt;一整本别的书&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;长话短说，&lt;em&gt;任何&lt;/em&gt;语言一旦允许调用其他语言，实际上都是不安全的，因为你可以让 C 做任意糟糕的事。没错：Java、Python、Ruby、Haskell……面对外部函数接口（FFI），大家都不安全。&lt;/p&gt;</description></item><item><title>5.3 基本操作</title><link>https://before80.github.io/prgms/Rust/tooManyLists/unsafeQueue/5.3-basics/</link><pubDate>Sun, 23 Aug 2026 16:06:00 +0800</pubDate><guid>https://before80.github.io/prgms/Rust/tooManyLists/unsafeQueue/5.3-basics/</guid><description>&lt;blockquote&gt;
&lt;p&gt;原文链接: &lt;a href="https://rust-unofficial.github.io/too-many-lists/fifth-basics.html"&gt;https://rust-unofficial.github.io/too-many-lists/fifth-basics.html&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;旁白：&lt;/strong&gt; 本节有一个潜伏的根本错误，因为这就是本书的意义所在。不过一旦我们开始使用 &lt;code&gt;unsafe&lt;/code&gt;，就可能做错事却仍能编译且&lt;em&gt;看似&lt;/em&gt;正常工作。根本错误会在下一节指出。不要在生产代码中使用本节内容！&lt;/p&gt;</description></item><item><title>5.4 Miri</title><link>https://before80.github.io/prgms/Rust/tooManyLists/unsafeQueue/5.4-miri/</link><pubDate>Sun, 23 Aug 2026 16:06:00 +0800</pubDate><guid>https://before80.github.io/prgms/Rust/tooManyLists/unsafeQueue/5.4-miri/</guid><description>&lt;blockquote&gt;
&lt;p&gt;原文链接: &lt;a href="https://rust-unofficial.github.io/too-many-lists/fifth-miri.html"&gt;https://rust-unofficial.github.io/too-many-lists/fifth-miri.html&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;em&gt;紧张地笑&lt;/em&gt; 这些 unsafe 东西太容易了，我不知道为什么大家都说不然。我们的程序完美运行。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;旁白：&lt;/strong&gt; 🙂&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;……对吧？&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;旁白：&lt;/strong&gt; 🙂&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;嗯，我们现在在写 &lt;code&gt;unsafe&lt;/code&gt; 代码，所以编译器不能像以前那样帮我们抓错。测试&lt;em&gt;碰巧&lt;/em&gt;能通过，但实际上可能在做非确定性的事。某种未定义行为的事。&lt;/p&gt;</description></item><item><title>5.5 栈借用</title><link>https://before80.github.io/prgms/Rust/tooManyLists/unsafeQueue/5.5-stacked-borrows/</link><pubDate>Sun, 23 Aug 2026 16:06:00 +0800</pubDate><guid>https://before80.github.io/prgms/Rust/tooManyLists/unsafeQueue/5.5-stacked-borrows/</guid><description>&lt;blockquote&gt;
&lt;p&gt;原文链接: &lt;a href="https://rust-unofficial.github.io/too-many-lists/fifth-stacked-borrows.html"&gt;https://rust-unofficial.github.io/too-many-lists/fifth-stacked-borrows.html&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;在上一节我们试着在 miri 下运行不安全的单链表队列，它说我们违反了&lt;em&gt;stacked borrows&lt;/em&gt;的规则，并链接了一些文档。&lt;/p&gt;
&lt;p&gt;通常我会带读者浏览文档，但我们不是那文档的目标受众。它更多是为研究 Rust 语义的编译器开发者和学者设计的。&lt;/p&gt;</description></item><item><title>5.6 测试栈借用</title><link>https://before80.github.io/prgms/Rust/tooManyLists/unsafeQueue/5.6-testing-stacked-borrows/</link><pubDate>Sun, 23 Aug 2026 16:06:00 +0800</pubDate><guid>https://before80.github.io/prgms/Rust/tooManyLists/unsafeQueue/5.6-testing-stacked-borrows/</guid><description>&lt;blockquote&gt;
&lt;p&gt;原文链接: &lt;a href="https://rust-unofficial.github.io/too-many-lists/fifth-testing-stacked-borrows.html"&gt;https://rust-unofficial.github.io/too-many-lists/fifth-testing-stacked-borrows.html&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;上一节（简化）Rust 内存模型 TL;DR：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Rust 概念上通过维护&amp;quot;借用栈&amp;quot;处理再借用&lt;/li&gt;
&lt;li&gt;只有栈顶的那个是&amp;quot;活跃&amp;quot;的（拥有独占访问）&lt;/li&gt;
&lt;li&gt;访问较低的那个时它变活跃，上面的被弹出&lt;/li&gt;
&lt;li&gt;不允许使用已从借用栈弹出的指针&lt;/li&gt;
&lt;li&gt;借用检查器确保 safe 代码遵守这一点&lt;/li&gt;
&lt;li&gt;Miri 理论上在运行时检查裸指针是否遵守&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;理论很多——进入本书真正的核心：写一些坏代码让我们的工具对我们尖叫。我们会过&lt;em&gt;大量&lt;/em&gt;例子，看心理模型是否合理，并对 stacked borrows 有直觉感受。&lt;/p&gt;</description></item><item><title>5.7 数据布局与基本操作回顾</title><link>https://before80.github.io/prgms/Rust/tooManyLists/unsafeQueue/5.7-layout-basics-redux/</link><pubDate>Sun, 23 Aug 2026 16:06:00 +0800</pubDate><guid>https://before80.github.io/prgms/Rust/tooManyLists/unsafeQueue/5.7-layout-basics-redux/</guid><description>&lt;blockquote&gt;
&lt;p&gt;原文链接: &lt;a href="https://rust-unofficial.github.io/too-many-lists/fifth-layout-basics-redux.html"&gt;https://rust-unofficial.github.io/too-many-lists/fifth-layout-basics-redux.html&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;前三节 TL;DR：随机混合 &lt;code&gt;&amp;amp;&lt;/code&gt;、&lt;code&gt;&amp;amp;mut&lt;/code&gt;、&lt;code&gt;Box&lt;/code&gt; 等安全指针与 &lt;code&gt;*mut&lt;/code&gt;、&lt;code&gt;*const&lt;/code&gt; 等不安全指针是未定义行为的配方，因为安全指针引入了我们在裸指针上没有遵守的额外约束。&lt;/p&gt;</description></item><item><title>5.8 额外内容</title><link>https://before80.github.io/prgms/Rust/tooManyLists/unsafeQueue/5.8-extras/</link><pubDate>Sun, 23 Aug 2026 16:06:00 +0800</pubDate><guid>https://before80.github.io/prgms/Rust/tooManyLists/unsafeQueue/5.8-extras/</guid><description>&lt;blockquote&gt;
&lt;p&gt;原文链接: &lt;a href="https://rust-unofficial.github.io/too-many-lists/fifth-extras.html"&gt;https://rust-unofficial.github.io/too-many-lists/fifth-extras.html&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;现在 &lt;code&gt;push&lt;/code&gt; 和 &lt;code&gt;pop&lt;/code&gt; 写好了，其他一切实际上和栈的情况完全一样，奇怪地。只有改变链表长度的操作需要碰 tail 指针。&lt;/p&gt;
&lt;p&gt;当然，现在一切都是 unsafe 指针，我们得重写代码来使用它们！既然要碰所有代码，不妨趁机确保没漏掉什么。&lt;/p&gt;</description></item><item><title>5.9 最终代码</title><link>https://before80.github.io/prgms/Rust/tooManyLists/unsafeQueue/5.9-final-code/</link><pubDate>Sun, 23 Aug 2026 16:06:00 +0800</pubDate><guid>https://before80.github.io/prgms/Rust/tooManyLists/unsafeQueue/5.9-final-code/</guid><description>&lt;blockquote&gt;
&lt;p&gt;原文链接: &lt;a href="https://rust-unofficial.github.io/too-many-lists/fifth-final.html"&gt;https://rust-unofficial.github.io/too-many-lists/fifth-final.html&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;好了，加一点点不安全，我们设法相对朴素的安全队列获得了线性时间改进，而且几乎复用了安全栈的全部逻辑！&lt;/p&gt;
&lt;p&gt;你知道，除了 miri 完全碾压我们、我们不得不写一篇关于 Rust 内存模型的短硕士论文那部分。你知道，照常。&lt;/p&gt;</description></item></channel></rss>