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. 堆区由用户自由分配,以便管理。

  • 相关阅读:
    Java实现 蓝桥杯VIP 基础练习 回形取数
    Java实现 蓝桥杯VIP 基础练习 回形取数
    Java实现 蓝桥杯VIP 基础练习 回形取数
    Java实现 蓝桥杯VIP 基础练习 回形取数
    Java实现 蓝桥杯VIP 基础练习 报时助手
    Java实现 蓝桥杯VIP 基础练习 报时助手
    Java实现 蓝桥杯VIP 基础练习 报时助手
    Java实现 蓝桥杯VIP 基础练习 报时助手
    Java实现 蓝桥杯VIP 基础练习 报时助手
    block的是发送信号的线程,又不是处理槽函数的线程
  • 原文地址:https://www.cnblogs.com/shuang0109/p/9118061.html
Copyright © 2011-2022 走看看