C++ 程序運行前內存分區模型

C++核心編程
本階段主要針對C++面向對象編程技術做詳細講解,探討C++中的核心和精髓。
1、內存分區模型
C++程序在執行時,將內存大方向劃分爲4個區域
●代碼區:存放函數體的二進制代碼,由操作系統進行管理的
●全局區:存放全局變量和靜態變量以及常量
●棧區:|由編譯器自動分配釋放,存放函數的參數值,局部變量等
●堆區:由程序員分配和釋放若程序員不釋放程序結束時由操作系統回收
內存四區意義:
不同區域存放的數據,賦予不同的生命週期,給我們更大的靈活編程

1.1程序運行前
在程序編譯後,生成了exe可執行程序,未執行該程序前分爲兩個區域
代碼區:
存放CPU執行的機器指令
代碼區是共享的,共享的目的是對於頻繁被執行的程序,只需要在內存中有一份代碼即可
代碼區是隻讀的,使其只讀的原因是防止程序意外地修改了它的指令
全局區:
全局變量和靜態變量存放在此.
全局區還包含了常量區,字符串常量和其他常量也存放在此.
該區域的數據在程序結束後由操作系統釋放.

#include<iostream>
#include<string>
using namespace std;

int main() {

	//創建普通局部變量
	int a = 10;
	int b = 10;
	cout << "局部變量a的地址爲:" << (int)&a << endl;
	cout << "局部變量b的地址爲:" << (int)&b << endl; 
	system(" pause") ;

}

全局變量:

#include<iostream>
#include<string>
using namespace std;


int g_a = 10;
int 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;

	system(" pause") ;

}

局部變量的內存地址和全局變量的內存地址明顯不不一塊區域

靜態變量:

#include<iostream>
#include<string>
using namespace std;


int g_a = 10;
int 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關鍵字修飾
    static	int g_a = 10;
	static  int g_b = 10;
	cout << "靜態變量g_a的地址爲 : " << (int)&g_a << endl;
	cout << "靜態變量g_b的地址爲 : " << (int)&g_b << endl;


	system(" pause") ;

}

 

字符串常量:

#include<iostream>
#include<string>
using namespace std;


int g_a = 10;
int 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關鍵字修飾
    static	int g_a = 10;
	static  int g_b = 10;
	cout << "靜態變量g_a的地址爲 : " << (int)&g_a << endl;
	cout << "靜態變量g_b的地址爲 : " << (int)&g_b << endl;


	//常量
    //字符串常量
	cout << "he1lo world字符串常量的地址爲:" << (int)&"he1lo world" << endl;
	//const修飾的變量


	system(" pause") ;

}

#include<iostream>
#include<string>
using namespace std;


int g_a = 10;
int g_b = 10;
 
const int c_g_a = 10;  //const修飾的全局變量  全局的常量
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關鍵字修飾
    static	int g_a = 10;
	static  int g_b = 10;
	cout << "靜態變量g_a的地址爲 : " << (int)&g_a << endl;
	cout << "靜態變量g_b的地址爲 : " << (int)&g_b << endl;


	//常量
    //字符串常量
	cout << "he1lo world字符串常量的地址爲:" << (int)&"he1lo world" << endl;

	//const修飾的變量
	//const修飾的全局變量,const修 飾的局部變量、
	cout << " 全局常量 c_g_a的地址爲 : " << (int)&c_g_a << endl;
	cout << " 全局常量 c_g_b的地址爲 : " << (int)&c_g_b << endl;

	system("pause") ;

}

 全局常量:

 

#include<iostream>
#include<string>
using namespace std;


int g_a = 10;
int g_b = 10;
 
const int c_g_a = 10;  //const修飾的全局變量  全局的常量
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關鍵字修飾
    static	int g_a = 10;
	static  int g_b = 10;
	cout << "靜態變量g_a的地址爲 : " << (int)&g_a << endl;
	cout << "靜態變量g_b的地址爲 : " << (int)&g_b << endl;


	//常量
    //字符串常量
	cout << "he1lo world字符串常量的地址爲:" << (int)&"he1lo world" << endl;

	//const修飾的變量
	//const修飾的全局變量,const修 飾的局部變量、
	cout << " 全局常量 c_g_a的地址爲 : " << (int)&c_g_a << endl;
	cout << " 全局常量 c_g_b的地址爲 : " << (int)&c_g_b << endl;


	const int c_l_a = 10; // c-const  g - global 1 - 1ocal
	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") ;

}

總結:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章