博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Unix环境变量--堆和栈的区别
阅读量:2194 次
发布时间:2019-05-02

本文共 663 字,大约阅读时间需要 2 分钟。

(1)管理方式不同:

程序运行时,栈是由操作系统自动分配管理,无需程序员人工控制,包括函数的参数值、返回值、局部变量等。而堆空间的申请、释放都是有程序员人工控制,也因此容易产生内存泄漏。

(2)空间大小不同:

栈是向低地址扩展,是一块连续的内存区域。即栈顶的地址和栈的最大容量是系统预先规定好的,当申请的空间超过栈的剩余空间时,将出现栈溢出错误。而堆是高地址扩展,是不连续的内存区域。因为系统是用链表来存储空闲内存地址的,且链表的遍历方向是由低地址向高地址扩展。

(3)产生碎片不同:

对于堆来说,频繁的malloc/free(new/delete)势必会造成内存空间的不连续,从而造成大量的内存碎片,程序的运行效率降低。而对于栈来说,分配的一定是连续的内存空间。

(4)分配方式不同:

堆都是程序中由malloc/new函数动态申请分配,有free/delete函数释放的;而栈的分配和释放是由操作系统完成的。栈的动态分配可有alloc()函数手动完成,但一般都无需手动操作,而是交给编译器自动进行申请和释放的。

(5)分配效率不同:

堆的内存分配效率比栈要低得多。因为栈是有操作系统提供的,会在底层堆栈提供支持,分配专门的寄存器存放栈的地址,包括压栈出栈也都有专门的指令执行,所以执行效率很高。而堆则是有C函数提供支持,它的机制相对复杂,例如分配一块内存,库函数会按照一定的算法在堆内存空间中搜索可用的足够大的内存空间,如果没有足够大的连续空间,则需要操作系统来重新整理堆内存,这样才有机会分到足够大小的空间,然后才返回。

转载地址:http://cwpub.baihongyu.com/

你可能感兴趣的文章
Leetcode C++《热题 Hot 100-15》437.路径总和III
查看>>
Leetcode C++《热题 Hot 100-17》461.汉明距离
查看>>
Leetcode C++《热题 Hot 100-18》538.把二叉搜索树转换为累加树
查看>>
Leetcode C++《热题 Hot 100-21》581.最短无序连续子数组
查看>>
Leetcode C++《热题 Hot 100-22》2.两数相加
查看>>
Leetcode C++《热题 Hot 100-23》3.无重复字符的最长子串
查看>>
Leetcode C++《热题 Hot 100-24》5.最长回文子串
查看>>
Leetcode C++《热题 Hot 100-28》19.删除链表的倒数第N个节点
查看>>
Leetcode C++《热题 Hot 100-29》22.括号生成
查看>>
Leetcode C++《热题 Hot 100-47》236.二叉树的最近公共祖先
查看>>
Leetcode C++《热题 Hot 100-48》406.根据身高重建队列
查看>>
《kubernetes权威指南·第四版》第二章:kubernetes安装配置指南
查看>>
Leetcode C++《热题 Hot 100-49》399.除法求值
查看>>
Leetcode C++《热题 Hot 100-51》152. 乘积最大子序列
查看>>
Leetcode C++ 《第181场周赛-1》 5364. 按既定顺序创建目标数组
查看>>
Leetcode C++ 《第181场周赛-2》 1390. 四因数
查看>>
阿里云《云原生》公开课笔记 第一章 云原生启蒙
查看>>
阿里云《云原生》公开课笔记 第二章 容器基本概念
查看>>
阿里云《云原生》公开课笔记 第三章 kubernetes核心概念
查看>>
阿里云《云原生》公开课笔记 第四章 理解Pod和容器设计模式
查看>>