C++內存分區模型——代碼區與全局區


內存分區模型

C++程序在執行時,將內存大方向划分為4個區域

  • 代碼區:存放函數體的二進制代碼,由操作系統進行管理的
  • 全局區:存放全局變量和靜態變量以及常量
  • 棧區:由編譯器自動分配釋放, 存放函數的參數值,局部變量等
  • 堆區:由程序員分配和釋放,若程序員不釋放,程序結束時由操作系統回收

內存四區意義:

不同區域存放的數據,賦予不同的生命周期, 給我們更大的靈活編程

程序運行前

​ 在程序編譯后,生成了exe可執行程序,未執行該程序前分為兩個區域

代碼區:

​ 存放 CPU 執行的機器指令

​ 代碼區是共享的,共享的目的是對於頻繁被執行的程序,只需要在內存中有一份代碼即可

​ 代碼區是只讀的,使其只讀的原因是防止程序意外地修改了它的指令

全局區:

​ 全局變量和靜態變量存放在此.

​ 全局區還包含了常量區, 字符串常量和其他常量也存放在此.

該區域的數據在程序結束后由操作系統釋放.
示例:

//全局變量
int g_a = 10;
int g_b = 10;

//全局常量
const int c_g_a = 10;
const int c_g_b = 10;

int main() {

	//局部變量
	int a = 10;
	int b = 10;

	//打印地址
	cout << "局部變量a地址為: " << (int)&a << endl;
	cout << "局部變量b地址為: " << (int)&b << endl;

	cout << "全局變量g_a地址為: " <<  (int)&g_a << endl;
	cout << "全局變量g_b地址為: " <<  (int)&g_b << endl;

	//靜態變量
	static int s_a = 10;
	static int s_b = 10;

	cout << "靜態變量s_a地址為: " << (int)&s_a << endl;
	cout << "靜態變量s_b地址為: " << (int)&s_b << endl;

	cout << "字符串常量地址為: " << (int)&"hello world" << endl;
	cout << "字符串常量地址為: " << (int)&"hello world1" << endl;

	cout << "全局常量c_g_a地址為: " << (int)&c_g_a << endl;
	cout << "全局常量c_g_b地址為: " << (int)&c_g_b << endl;

	const int c_l_a = 10;
	const int c_l_b = 10;
	cout << "局部常量c_l_a地址為: " << (int)&c_l_a << endl;
	cout << "局部常量c_l_b地址為: " << (int)&c_l_b << endl;

	system("pause");

	return 0;
}

打印結果:

總結:

  • C++中在程序運行前分為全局區和代碼區
  • 代碼區特點是共享和只讀
  • 全局區中存放全局變量、靜態變量、常量
  • 常量區中存放 const修飾的全局常量 和 字符串常量


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM