有言在先
如果你不理解且不愿理解 内存 != 存储, 请放弃 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) (将来返回时使用)