zoukankan      html  css  js  c++  java
  • C++内存分区

    【1】内存分区模型

    各种说法,但都有一定道理,只是划分角度或逻辑不同。

    1、三部分

    C++程序在执行时,将供用户使用内存大致划分为三个区域:

    (1)程序存储区:存放函数体的二进制代码,由操作系统进行管理;

    (2)静态存储区:静态存储区数据在程序开始就已经分配好了内存,执行过程中,它们所占的存储单元是固定的,在程序结束时就释放,所以该区数据一般为全局变量。

    (3)动态存储区:动态存储区数据是在程序的执行过程中根据需要动态分配和动态释放的存储单元。

    2、四部分

    C++程序在执行时,将供用户使用内存大致划分为四个区域:

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

    (2)全局区:存放全局变量和静态(全局、局部)变量和字符串常量;

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

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

    3、五部分

    C++程序在执行时,将供用户使用内存大致划分为五个区域:

    (1)程序代码区:存放函数体(类的成员函数、全局函数)的二进制代码;

    (2)全局/静态区(static):全局变量和静态变量的存储是放在一起的,在程序编译时分配;

    (3)文字常量区:存放常量字符串。

    (4)栈区(stack):由编译器自动分配释放,存放函数的参数值,局部变量值等,其操作方法类似数据结构中的栈。

    (5)堆区(heap):一般由程序员分配释放,与数据结构中的堆毫无关系,分配方式类似于链表。

    综上所述,个人建议,按四个区域理解即可。

    【2】内存分区意义

    不同区域存放不同的数据,赋予数据不同的生命周期, 更大限度的灵活编程。

    【3】内存分区示例

    示例代码:

     1 #include <iostream>
     2 using namespace std;
     3 
     4 //全局变量
     5 int g_a = 10;
     6 int g_b = 10;
     7 
     8 //全局常量
     9 const int c_g_a = 10;
    10 const int c_g_b = 10;
    11 
    12 //全局静态
    13 static int s_g_a = 11;
    14 static int s_g_b = 11;
    15 
    16 int main() 
    17 {
    18     //局部变量
    19     int a = 10;
    20     int b = 10;
    21 
    22     //打印地址
    23     cout << "局部变量a地址为: " << (int)&a << endl;
    24     cout << "局部变量b地址为: " << (int)&b << endl << endl;
    25 
    26     cout << "全局变量g_a地址为: " << (int)&g_a << endl;
    27     cout << "全局变量g_b地址为: " << (int)&g_b << endl << endl;
    28 
    29     //静态变量
    30     static int s_l_a = 10;
    31     static int s_l_b = 10;
    32 
    33     cout << "局部静态变量s_l_a地址为: " << (int)&s_l_a << endl;
    34     cout << "局部静态变量s_l_b地址为: " << (int)&s_l_b << endl << endl;
    35 
    36     cout << "全局静态变量s_g_a地址为: " << (int)&s_g_a << endl;
    37     cout << "全局静态变量s_g_b地址为: " << (int)&s_g_b << endl << endl;
    38 
    39     cout << "字符串常量地址为: " << (int)&"hello world" << endl;
    40     cout << "字符串常量地址为: " << (int)&"hello world1" << endl << endl;
    41 
    42     cout << "全局常量c_g_a地址为: " << (int)&c_g_a << endl;
    43     cout << "全局常量c_g_b地址为: " << (int)&c_g_b << endl << endl;
    44 
    45     const int c_l_a = 10;
    46     const int c_l_b = 10;
    47     cout << "局部常量c_l_a地址为: " << (int)&c_l_a << endl;
    48     cout << "局部常量c_l_b地址为: " << (int)&c_l_b << endl << endl;
    49 
    50     int* p_l_a = new int(100);
    51     int* p_l_b = new int(100);
    52     cout << "堆地址p_l_a为: " << (int)p_l_a << endl;
    53     cout << "堆地址p_l_b为: " << (int)p_l_b << endl << endl;
    54 
    55     cout << "局部指针变量p_l_a地址为: " << (int)&p_l_a << endl;
    56     cout << "局部指针变量p_l_b地址为: " << (int)&p_l_b << endl << endl;
    57 
    58     system("pause");
    59 
    60     return 0;
    61 }
    62 
    63 /*
    64 局部变量a地址为: 193985460
    65 局部变量b地址为: 193985492
    66 
    67 全局变量g_a地址为: 541388800
    68 全局变量g_b地址为: 541388804
    69 
    70 局部静态变量s_l_a地址为: 541388816
    71 局部静态变量s_l_b地址为: 541388820
    72 
    73 全局静态变量s_g_a地址为: 541388808
    74 全局静态变量s_g_b地址为: 541388812
    75 
    76 字符串常量地址为: 541376352
    77 字符串常量地址为: 541376368
    78 
    79 全局常量c_g_a地址为: 541375408
    80 全局常量c_g_b地址为: 541375412
    81 
    82 局部常量c_l_a地址为: 193985524
    83 局部常量c_l_b地址为: 193985556
    84 
    85 堆地址p_l_a为: 1848809664
    86 堆地址p_l_b为: 1848791904
    87 
    88 局部指针变量p_l_a地址为: 193985592
    89 局部指针变量p_l_b地址为: 193985624
    90 */

    示例分析图:

    【4】Windows内存布局

    good good study, day day up.

    顺序 选择 循环 总结

  • 相关阅读:
    struts2 标签为简单标签
    html a标签链接使用action 参数传递中文乱码
    html 字体加粗
    Unity3D学习笔记(一):Unity简介、游戏物体、组件和生命周期函数
    Unity3D学习笔记(一):Unity3D简介 111
    C#学习笔记(二十):C#总结和月考讲解
    C#学习笔记(十九):字典
    C#学习笔记(十八):数据结构和泛型
    C#学习笔记(十七):委托、事件、观察者模式、匿名委托和lambert表达式
    C#学习笔记(十六):索引器和重载运算符
  • 原文地址:https://www.cnblogs.com/Braveliu/p/15127735.html
Copyright © 2011-2022 走看看