首页 > 其他 > 详细

零星问题

时间:2020-07-09 11:20:46      阅读:72      评论:0      收藏:0      [点我收藏+]

堆和栈(底层)

在进行C/C++编程时, 需要程序员对内存的了解比较精准。 经常需要操作的内存可分为以下几个类别。
栈区( stack) : 由编译器自动分配和释放, 存放函数的参数值、 局部变量的值等。其操作方式类似于数据结构中的栈。
堆区( heap) : 一般由程序员分配和释放, 若程序员不释放, 程序结束时可能由操作系统回收。 注意它与数据结构中的堆是两回事, 分配方式倒是类似于链表。
全局区( 静态区) ( static) : 全局变量和静态变量的存储是放在一块的, 初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一
块区域。 程序节束后由系统释放。
文字常量区: 常量字符串就是放在这里的。 程序节束后由系统释放。
程序代码区: 存放函数体的二进制代码。

1. 申请方式

栈: 由系统自动分配。 例如, 声明在函数中的一个局部变量int b, 系统自动在栈中为b 开辟空间。

堆: 需要程序员自己申请, 并指明大小, 在C中用malloc函数。 如: 在C++中用new运算符。

2. 申请后系统的响应

栈: 只要栈的剩余空间大于所申请空间, 系统将为程序提供内存, 否则将报异常提示栈 溢出。

堆: 首先应该知道操作系统有一个记录空闲内存地址的链表, 当系统收到程序的申请 时, 会遍历该链表, 寻找第一个空间大于所申请空间的堆节点, 然后将该节点从空闲节点链 表中删除, 并将该节点的空间分配给程序。 对于大多数系统, 会在这块内存空间中的首地址 处记录本次分配的大小, 这样, 代码中的delete语句才能正确地释放本内存空间。 另外, 由 于找到的堆节点的大小不一定正好等于申请的大小, 系统会自动地将多余的那部分重新放入 空闲链表中。

3. 申请大小的限制

栈: 在Windows下, 栈是向低地址扩展的数据结构, 是一块连续的内存的区域。 这句话 的意思是栈顶的地址和栈的最大容量是系统预先规定好的, 在Windows下, 栈的大小是 2MB( 也有的说是1MB, 总之是一个编译时就确定的常数) , 如果申请的空间超过栈的剩余空间, 将提示overflow。 因此, 能从栈获得的空间较小。

堆: 堆是向高地址扩展的数据结构, 是不连续的内存区域。 这是由于系统是用链表存储 空闲内存地址的, 自然是不连续的。 而链表的遍历方向是由低地址向高地址, 堆的大小受限 于计算机系统中有效的虚拟内存。 由此可见, 堆获得的空间比较灵活, 也比较大

4. 申请效率的比较

栈: 由系统自动分配, 速度较快。 但程序员无法控制。

堆: 是由new分配的内存, 一般速度比较慢, 而且容易产生内存碎片, 不过用起来最方 便。

5. 堆和栈中的存储内容

栈: 在函数调用时, 第一个进栈的是主函数中的下一条指令( 函数调用语句的下一条可 执行语句) 的地址, 然后是函数的各个参数。 在大多数的C编译器中, 参数是由右往左入栈 的, 然后是函数中的局部变量。 注意静态变量是不入栈的。 当本次函数调用节束后, 局部变量先出栈, 然后是参数, 最后栈顶指针指向最开始存的 地址, 也就是主函数中的下一条指令, 程序由该点继续运行。 堆: 一般是在堆的头部用一个字节存放堆的大小。 堆中的具体内容由程序员安排。

堆和栈(数据结构)以及队列

栈是一种先进后出的数据结构,常见的应用是

字符串的倒序输出、

判断字符的成对出现、

数制转换(将十进制的数转换为2-9的任意进制的数:我们都知道,通过求余法,可以将十进制数转换为其他进制,比如要转为八进制,将十进制数除以8,记录余数,然后继续将商除以8,一直到商等于0为止,最后将余数倒着写数来就可以了)、

后缀表达式求结果(3 4 + 5 × 6 -,可求得29)、

函数的调用。

队列是一种先进先出的数据结构,常见的应用是

树的层次遍历、

银行排队问题、

任务队列、

进程队列。

堆也被称为优先队列,队列中允许的操作是 先进先出(FIFO),在队尾插入元素,在队头取出元素。而堆也是一样,在堆底插入元素,在堆顶取出元素。二叉树的衍生,有最小堆最大堆的两个概念,将根节点最大的堆叫做最大堆或大根堆,根节点最小的堆叫做最小堆或小根堆。堆排序。

零星问题

原文:https://www.cnblogs.com/yvlian/p/13272318.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!