【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.
順序 選擇 循環 總結