zoukankan      html  css  js  c++  java
  • 零星问题

    堆和栈(底层)

    在进行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处理数据的速度。

  • 相关阅读:
    iOS之使用AFN进行序列化处理(5)
    iOS之AFN文件上传(4)
    iOS之AFN使用技巧(3)
    iOS之AFN框架基本使用(2)
    iOS之AFN简介(1)
    iOS之JSON解析和视频的简单播放
    iOS之带有边框的圆形图片裁剪
    SQL limit offset
    Ubuntu安装pycharm, No JDK found. Please validate either PYCHARM_JDK, JDK_HOME or JAVA_HOME environment variable points to valid JDK installation
    scrapy项目运行报错: exceptions.ImportError: No module named win32api
  • 原文地址:https://www.cnblogs.com/yvlian/p/13272318.html
Copyright © 2011-2022 走看看