• c/c++程序中内存区划分


    转自:http://wenzongliang.iteye.com/blog/1866629

     操作系统启动程序时会加载程序代码到内存(叫程序的代码区),然后创建进程PCB为进程分配内存资源(数据区,32系统为4GB)c/c++程序的数据区被c/c++分为5个区,他们分别是全局/静态存储区、常量存储区、栈、堆、自由存储区

       全局/静态存储区,全局变量和静态变量被分配到同一块内存中,在以前的C语言中,全局变量又分为初始化的和未初始化的,在C++里面没有这个区分了,他们共同占用同一块内存区。

      常量存储区,这是一块比较特殊的存储区,他们里面存放的是常量,不允许修改。

      ,在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。

      ,就是那些由new分配的内存块,他们的释放编译器不去管,由我们的应用程序去控制,一般一个new就要对应一个delete。如果程序员没有释放掉,那么在程序结束后,操作系统会自动回收。

      自由存储区,就是那些由malloc等分配的内存块,他和堆是十分相似的,不过它是用free来结束自己的生命的。

    以一小段代码为例,提几个问题

    #include "iostream"
    using namespace std;
    void ss(int a)
    {
    int b=5;
    cout<<b+a<<endl;

    }
    int main()
    {
    ss(5);

    int * p=new int;

    delete p;
    return 0;
    }

    1、这个EXE一运行必然要占用一块内存,这块内存是连续的吗?

    2、既然调用了函数,一定有一块内存吧。内存是在这个EXE之内吗?

    3,自由存储是一个概念吗

    4、int * p=new int; 这句话开辟的内存地址在EXE的范围内吗?

    5、是什么时候产生的?是程序一运行的时候?还是调用函数的时候-

    --------------------------------------

    1. exe运行的时候,系统会创建一个进程,同时会分配一块独立的内存空间给该进程,这个内存空间在32位系统上是从0x00000000到0xFFFFFFFF, 4G的空间大小。

    2. CPU时间分配的单位是线程,所有的函数都是在一个线程里面执行的,当线程创建时,系统会分配一段内存和寄存器给这个线程,线程就可以调用函数了。内存是在进程内存空间里面。exe是一个文件的概念,只有当exe运行之后,系统创建的exe的进程实例之后,才会分配内存,所有内存是在exe的进程实例中的,在exe之内的说法不妥。

    3.自由存储不是一个概念。一般而言,自由存储是指CRT(C运行时库)通过malloc,free函数管理的内存。特指通过new,delete管理的内存。但是在部分编译器的实现上这两块内存都是同一种管理方式。

    4. int* p = new int 如上述,在exe的进程空间内存空间里面。

    产生的时机如2所讲,是在一个线程创建的时候。

     

    在C++程序中内存是分为5块的,注意区分

    1.

    2.

    3.自由存储

    4.全局/静态存储

    5.文字常量存储

  • 相关阅读:
    【Java8新特性】你知道Java8为什么要引入Lambda表达式吗?
    你说你懂计算机网络,那这些你都知道吗
    程序员需要了解的硬核知识之控制硬件
    程序员需要了解的硬核知识之汇编语言(全)
    真的,Kafka 入门一篇文章就够了
    程序员需要了解的硬核知识之汇编语言(一)
    带你涨姿势的认识一下 Kafka 消费者
    程序员需要了解的硬核知识之操作系统和应用
    详解Kafka Producer
    程序员需要了解的硬核知识之操作系统入门
  • 原文地址:https://www.cnblogs.com/LCGIS/p/3205850.html
Copyright © 2020-2023  润新知