堆和栈(底层)
在进行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),在队尾插入元素,在队头取出元素。而堆也是一样,在堆底插入元素,在堆顶取出元素。二叉树的衍生,有最小堆最大堆的两个概念,将根节点最大的堆叫做最大堆或大根堆,根节点最小的堆叫做最小堆或小根堆。堆排序。
面向过程 v.s.面向对象
面向过程:性能比面向对象高,因为类调用时需要实例化,开销比较大,比较消耗资源;比如单片机、嵌入式开发、Linux/Unix等一般采用面向过程开发,性能是最重要的因素。 C语言
面向对象 :易维护、易复用、易扩展,由于面向对象有封装、继承、多态性的特性,可以设计出低耦合的系统,使系统更加灵活、更加易于维护 。
抽象类的特点:
抽象类不能被实例化;抽象方法只能在抽象类中,抽象类中也可以有非抽象方法;继承抽象类的类,要么是抽象类,要么必须实现抽象类中的所有抽象方法。python中由abc模块的abstarctmethod可以装饰方法。
网络吞吐量:在不丢失帧的情况下,网络能够传输的最大速率。
系统吞吐量:cpu在单位时间完成的进程数量。
什么是缓存
缓存介于内存和CPU之间的临时存储器,空间比内存小,数据访问速度比内存块,接近CPU处理数据的速度。