Skip to content

有言在先

如果你不理解且不愿理解 内存 != 存储, 请放弃 Rust 及所有其他编程语言.

施工中

注意

堆内存栈内存并非在内存上客观存在的实体, 而是由操作系统自行施行的两个内存管理策略.

text
      高地址 (栈顶,向下增长)
      ------------------------------------------> 栈区(高塔)
      
      ┌─────────────────────────────────────┐
      │         块作用域 (foo内部)            │  ← 临时栈帧
      │  ──────────────────────────────     │
      │  a : String   (栈上三个word)         │
      │    ptr  ───────────────────────────────┐
      │    len : 5                          │  │
      │    cap : 5                          │  │
      └─────────────────────────────────────┘  │

      ┌─────────────────────────────────────┐  │
      │          foo 函数栈帧                │  │
      │  ──────────────────────────────     │  │
      │  a : &str    (栈上两个word)          │  │
      │    ptr  ───────────────────────┐    │  │
      │    len : 5                     │    │  │
      │  b : String   (栈上三个word)    │    │  │
      │    ptr  ───────────────────┐   │    │  │
      │    len : 11                │   │    │  │
      │    cap : 16 (已扩容)        │   │    │  │
      └────────────────────────────┼───┼────┼──┘
                                   │   │    │
      ┌────────────────────────────┼───┼────┼──┐
      │         main 函数栈帧       │   │    │  │
      │  ──────────────────────────│   │    │  │
      │  a : &str                  │  │    │  │
      │    ptr  ─────────────────┐ │  │    │  │
      │    len : 5              │ │  │    │  │
      │  k : String             │ │  │    │  │
      │    ptr  ──────────────┐ │ │  │    │  │
      │    len : 4           │ │ │  │    │  │
      │    cap : 4          │ │ │  │    │  │
      └───────────────────────┼─┼─┼──┼────┼──┘
                              │ │ │  │    │
      低地址 (栈底)           │ │ │  │    │
      =========================================  <-- 用户态/内核态边界
      
      ░░░░░░░░░░░░░░░░░░░ 堆区(散乱分布) ░░░░░░░░░░░░░░░░░░░
      
          ▲                ▲                ▲
          │                │                │
      ┌───┴───┐        ┌───┴───┐        ┌───┴───┐
      │ 'r','u'│        │ 'w','o'│        │ 'H','E'│
      │ 's','t'│        │ 'r','l'│        │ 'L','L'│
      │  \0    │        │ 'd','h'│        │ 'O','\0'│
      └───┬───┘        │ 'e','l'│        └───┬───┘
          │            │ 'l','o'│            │
          └────────┐   │  \0    │   ┌────────┘
                   │   └───┬───┘   │
                   └───────┼───────┘

                       (main.k.ptr)   (block.a.ptr)
                       (foo.b.ptr)
      
      
      ░░░░░░░░░░░░░░░░░░░ 静态数据区(只读) ░░░░░░░░░░░░░░░░░
      
          ┌─────────────┐          ┌─────────────────┐
          │   "hello"   │          │   "Success!"    │
          │   [h,e,l,l,o,\0]       │ [S,u,c,c,e,s,s,!,\0]
          └──────┬──────┘          └────────┬────────┘
                 │                          │
                 └────────────┬─────────────┘

                        (main.a.ptr)
                        (foo.a.ptr)  (将来返回时使用)