zoukankan      html  css  js  c++  java
  • C++中的内存分配

    C++内存分区模式

    C++程序在执行时,将内存分为4个区域。

    ²  代码区:存放函数体的二进制代码,由操作系统进行管理;

    ²  全局区:存放全局变量,静态变量以及常量;

    ²  栈区:由编译器自动分配释放,存放函数的参数值,局部变量等;

    ²  堆区:由程序员分配和释放,若程序员不释放,程序结束时由操作系统回收。

    1.      程序运行前

    在程序编译后生成了可执行的.exe程序,未执行该程序前分为两个区域:

           代码区:

                  存放CPU执行的机器指令;

                  代码区是共享的,目的是对于被频繁执行的程序,只需要在内存中有一份代码即可;

                  代码区是只读的,原因是防止程序意外修改了他的指令;

           全局区:

                  全局变量和静态变量存放在此;

                  全局区还包含了常量区,字符串常量和其他常量存放在此;

                  该区域的数据在程序结束后由操作系统释放;

     1 //几种变量和常量的内存分配演示
     2 #include<iostream>
     3 using namespace std;
     4 
     5 //全局变量定义
     6 int global_a = 0; 
     7 
     8 //const修饰的全局变量
     9 const int const_a =0; 
    10 
    11 int main()
    12 {
    13     //变量定义
    14     int a = 0;
    15     //静态变量定义
    16     static int static_a= 0;
    17     //常量定义
    18     //字符串常量
    19     string string_a = "hello";
    20     //const修饰的常量
    21     const int const_b = 0; 
    22     
    23     cout<<"局部变量的地址:"<<(int)&a<<endl; 
    24     cout<<"字符串变量的地址:"<<(int)&string_a<<endl;
    25     cout<<"字符串常量的地址:"<<(int)&"hello"<<endl;
    26     cout<<"const修饰的全局变量的地址"<<(int)&const_a<<endl;
    27     cout<<"const修饰的局部变量的地址"<<(int)&const_b<<endl;
    28     cout<<"全局变量的地址:"<<(int)&global_a<<endl;
    29     cout<<"静态变量的地址:"<<(int)&static_a<<endl;
    30      
    31     system("pause");
    32     return 0;
    33  } 

    运行结果为:

     由以上运行结果可以得出:全局变量,静态变量,一些常量(字符串常量,const修饰的全局变量)是保存在全局区域;局部变量(包括字符串变量)是保存在栈区的,尤其需要注意的是const修饰的局部变量虽然是常量,但也是保存在栈区的。

    2.      程序运行后

    栈区:

    由编译器自动分配释放,存放函数的参数值,局部变量等;

           函数中不应该范围局部变量的地址,因为在函数调用完毕后局部变量会被释放。

    堆区:

           由程序员分配和释放,若没有释放,在程序运行完成后由操作系统该释放;

           主要是利用new关键字在堆区分配内存,delete关键字释放内存。

  • 相关阅读:
    BIEE建模参考规范
    informatica 学习日记整理
    Web Service 的工作原理
    Oracle 时间差计算
    oracle基础知识
    Oracle 外连接和 (+)号的用法
    根据appId匹配项目名称
    vue技术分享-你可能不知道的7个秘密
    echarts3 迁徙图 迁入迁出
    ES6学习笔记
  • 原文地址:https://www.cnblogs.com/mzct123/p/13031265.html
Copyright © 2011-2022 走看看