Skip to content

Commit

Permalink
fixed wrong description of stack and system
Browse files Browse the repository at this point in the history
  • Loading branch information
wayslog committed Feb 6, 2017
1 parent 3f597ef commit cbf64b6
Showing 1 changed file with 1 addition and 1 deletion.
2 changes: 1 addition & 1 deletion heap-stack/heap-stack.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@

操作系统会将物理内存映射成虚拟地址空间,程序在启动时看到的虚拟地址空间是一块完整连续的内存。

栈内存从高位地址向下增长,且栈内存分配是连续的,一般操作系统对栈内存大小是有限制的,Linux/Unix 类系统上面可以通过 ulimit 设置最大栈空间大小,所以C中无法创建任意长度的数组,函数调用时会创建一个临时栈空间,通常由操作系统完成的,函数调用结束后操作系统会自动销毁栈空间,其上内存也会自动释放,无需程序员手动干预,因而栈内存申请和释放是非常高效的。
栈内存从高位地址向下增长,且栈内存分配是连续的,一般操作系统对栈内存大小是有限制的,Linux/Unix 类系统上面可以通过 ulimit 设置最大栈空间大小,所以 C 语言中无法创建任意长度的数组。在Rust里,函数调用时会创建一个临时栈空间,调用结束后 Rust 会让这个栈空间里的对象自动进入 `Drop` 流程,最后栈顶指针自动移动到上一个调用栈顶,无需程序员手动干预,因而栈内存申请和释放是非常高效的。

相对地,堆上内存则是从低位地址向上增长,堆内存通常只受物理内存限制,而且通常是不连续的,一般由程序员手动申请和释放的,如果想申请一块连续内存,则操作系统需要在堆中查找一块未使用的满足大小的连续内存空间,故其效率比栈要低很多,尤其是堆上如果有大量不连续内存时。另外内存使用完也必须由程序员手动释放,不然就会出现内存泄漏,内存泄漏对需要长时间运行的程序(例如守护进程)影响非常大。

Expand Down

0 comments on commit cbf64b6

Please sign in to comment.