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.
顺序 选择 循环 总结