zoukankan      html  css  js  c++  java
  • C++内存模型

    C的内存基本上分为4部分:静态存储区、堆区、栈区以及常量区。他们的功能不同,对他们使用方式也就不同。

     在C++中内存分成5个区,分别是堆、栈、全局/静态存储区、常量存储区和代码区;

    1、栈,就是那些由编译器在需要的时候分配,在不需要的时候自动清楚的变量的存储区,里面的变量通常是局部变量、函数参数等。

    2、堆,就是那些由new分配的内存块,他们的释放编译器不去管,由我们的应用程序去控制,一般一个new就要对应一个delete。如

    果程序员没有释放掉,那么在程序结束后,操作系统会自动回收。

    3、全局/静态存储区,全局变量和静态变量被分配到同一块内存中,在以前的C语言中,全局变量又分为初始化的和未初始化的,在

    C++里面没有这个区分了,他们共同占用同一块内存区。

    4、常量存储区,这是一块比较特殊的存储区,他们里面存放的是常量,不允许修改(当然,你要通过非正当手段也可以修改)。

    5、代码区 (.text段),存放代码(如函数),不允许修改(类似常量存储区),但可以执行(不同于常量存储区)。

    内存模型组成部分:自由存储区,动态区、静态区;

    根据c/c++对象生命周期不同,c/c++的内存模型有三种不同的内存区域,即:自由存储区,动态区、静态区。

    自由存储区:局部非静态变量的存储区域,即平常所说的栈;

    动态区: 用new ,malloc分配的内存,即平常所说的堆;

    静态区:全局变量,静态变量,字符串常量存在的位置;

    注:代码虽然占内存,但不属于c/c++内存模型的一部分;

    一个正在运行着的C编译程序占用的内存分为5个部分:代码区、初始化数据区、未初始化数据区、堆区 和栈区;

    (1)代码区(text segment):代码区指令根据程序设计流程依次执行,对于顺序指令,则只会执行一次(每个进程),如果反复,则需要使用跳转指令,如果进行递归,则需要借助栈来实现。注意:代码区的指令中包括操作码和要操作的对象(或对象地址引用)。如果是立即数(即具体的数值,如5),将直接包含在代码中;

    (2)全局初始化数据区/静态数据区(Data Segment):只初始化一次。
    (3)未初始化数据区(BSS):在运行时改变其值。
    (4)栈区(stack):由编译器自动分配释放,存放函数的参数值、局部变量的值等,其操作方式类似于数据结构中的栈。
    (5)堆区(heap):用于动态内存分配。

    为什么分成这么多个区域?

    主要基于以下考虑:

    1. 代码是根据流程依次执行的,一般只需要访问一次,而数据一般都需要访问多次,因此单独开辟空间以方便访问和节约空间。
    2. 未初始化数据区在运行时放入栈区中,生命周期短。
    3. 全局数据和静态数据有可能在整个程序执行过程中都需要访问,因此单独存储管理。
    4. 堆区由用户自由分配,以便管理。

  • 相关阅读:
    2018 桂林ccpc现场赛 总结
    2018 南京icpc现场赛总结
    nowcoder 203J Graph Coloring I(dfs)
    nowcoder 203A Knight(贪心+打表)
    nowcoder 202H-卡牌游戏
    nowcoder 202F-平衡二叉树
    topcoder srm 738 div1 FindThePerfectTriangle(枚举)
    codeforces 1041 E.Vasya and Good Sequences(暴力?)
    hdu 3507 Print Article(dp+斜率优化)
    hdu 1007 Quoit Design(分治)
  • 原文地址:https://www.cnblogs.com/shuang0109/p/9118061.html
Copyright © 2011-2022 走看看