zoukankan      html  css  js  c++  java
  • C++(十八) — 内存模式、堆和栈

    1、内存模式

      一个程序执行时,先复制到内存,然后CPU逐句读取指令执行。

      每个存储单元存放一个字节(8bit)数据,每个有一个唯一的地址,地址是顺序编码的。比如:一台计算机256MB内存,则有256*1024*1024个内存单元,如果用7位十六进制数表示地址值,则范围是:0x0000000~0xFFFFFFF。

      内存分配:

    • (1)代码区:存放程序代码;
    • (2)全局数据区 或 静态变量区:全局变量 + 静态数据。存放长期数据的区域,从程序开始执行到结束,都会在内存中占有固定的字节;
    • (3)栈区:局部变量。存放程序函数中的局部变量,就是,用到某个函数时,该函数定义的变量就存在栈区,退出时相应的变量会自动释放;还有特点:先进后出,即先进栈的变量后退出;
    • (4)堆区:动态数据,指针。在程序执行过程中申请的内存空间,也要在程序结束时释放,否则内存泄漏;

    2、变量存储位置、作用域

    (1)全局变量

      存储位置:全局数据区(程序结束后由系统释放);

      作用域:全局作用域,只需在一个源文件中定义,作用所有;

      周期:一直存在;

      引用方式:其他文件使用时,用extern 关键字声明。(注意:不能两个文件中定义相同的名字,重定义了);

    (2)静态变量

      存储位置:全局数据区(程序结束后由系统释放);

      作用域:文件作用域,在被定义的文件中;

      周期:一直存在;

      引用方式:static, const。(文件不相互包含,不同文件可定义完全相同的两个静态变量,是两个完全不同的变量)

    (3)局部变量

      存储位置:栈区。(编译器自动分配释放,存放函数参数值,局部变量值);

      作用域:局部;

      周期:程序运行出则销毁;

      引用方式:

    (4)静态局部变量

      存储位置:全局数据区;

      作用域:局部作用域;

      周期:一直存在;

      引用方式:static。(只被初始化一次)

    (5)动态数据,指针

      存储位置:堆区;

      作用域:局部作用域;

      周期:在程序执行中申请的内存空间,在程序结束中释放;

    3、内存中的堆和栈 

    (1)申请方式、回收方式

    • 栈:局部变量和参数,系统自动分配、回收;
    • 堆:程序员分配释放,new/malloc,由os回收,分配方式类似于链表,如忘记释放,则内存泄漏;

    (2)缓存方式

    • 栈:一级缓存,由高地址向低方向增长(以地址增长方向为正);(存的局部变量,空间固定,栈内存是:先进后出
    • 堆:二级缓存,向高地址方向增长,(不连续内存空间);

    (3)空间限制

    • 栈:空间较小,是固定值;
    • 堆:不连续内存,空间大且灵活;
  • 相关阅读:
    cookie 和session 的区别
    求职面试技巧
    php setcookie(name, value, expires, path, domain, secure) 参数详解
    (输出缓冲)函数的妙用
    linux下忘记mysql root密码解决办法
    php导入导出
    nginx的基本配置和虚拟主机的配置
    实战练习235页
    接口练习
    总结构建子类对象时的顺序
  • 原文地址:https://www.cnblogs.com/eilearn/p/10134214.html
Copyright © 2011-2022 走看看