最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++內(nèi)存四區(qū)模型使用及說明

 更新時間:2025年09月24日 09:29:52   作者:蔥鹵山豬  
C++內(nèi)存分為代碼區(qū)(只讀共享)、全局區(qū)(存全局/靜態(tài)變量及常量)、棧區(qū)(自動管理,存函數(shù)參數(shù)和局部變量)、堆區(qū)(手動管理,用new分配,delete釋放),各區(qū)域數(shù)據(jù)生命周期不同,提供靈活編程

1 內(nèi)存分區(qū)模型

C++程序在執(zhí)行時,將內(nèi)存大方向劃分為4個區(qū)域

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

內(nèi)存四區(qū)意義:

不同區(qū)域存放的數(shù)據(jù),賦予不同的生命周期, 給我們更大的靈活編程

1.1 程序運行前

? 在程序編譯后,生成了exe可執(zhí)行程序,未執(zhí)行該程序前分為兩個區(qū)域

? 代碼區(qū):

  • ? 存放 CPU 執(zhí)行的機器指令
  •  代碼區(qū)是共享的,共享的目的是對于頻繁被執(zhí)行的程序,只需要在內(nèi)存中有一份代碼即可
  • ? 代碼區(qū)是只讀的,使其只讀的原因是防止程序意外地修改了它的指令

? 全局區(qū):

  • 該區(qū)域的數(shù)據(jù)在程序結(jié)束后由操作系統(tǒng)釋放.

? 全局變量和靜態(tài)變量存放在此.

全局變量注意事項:

1、在函數(shù)外部定義的變量,使用范圍從定義的地方開始到——>本源文件結(jié)束

2、如果沒給初始值,會自動初始化為0

3、當全局變量名稱和局部變量名稱相同時,使用的是局部變量

4、若使用的全局變量定義于其他的源文件中,可以使用extern關(guān)鍵字聲明【extern int a;】

靜態(tài)變量注意事項:static關(guān)鍵字

1、static作用全局變量之前,稱為靜態(tài)全局變量,限制其他源文件使用(僅限本源文件使用)

2、static作用局部變量之前,稱為靜態(tài)局部變量,只初始化一次,函數(shù)結(jié)束后空間不會釋放

3、static作用函數(shù)之前,稱為靜態(tài)函數(shù),僅限本文件使用

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

示例:

//全局變量
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;

	//靜態(tài)變量——static關(guān)鍵字
	1、static作用全局變量之前,稱為靜態(tài)全局變量,限制其他源文件使用(僅限本源文件使用)
	2、static作用局部變量之前,稱為靜態(tài)局部變量,只初始化一次,函數(shù)結(jié)束后空間不會釋放
	3、static作用函數(shù)之前,稱為靜態(tài)函數(shù),僅限本文件使用
	
	static int s_a = 10;
	static int s_b = 10;

	cout << "靜態(tài)變量s_a地址為: " << (int)&s_a << endl;
	cout << "靜態(tài)變量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;
}
  • 打印結(jié)果:

總結(jié):

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

1.2 程序運行后

?棧區(qū):

? 由編譯器自動分配釋放, 存放函數(shù)的參數(shù)值,局部變量等

? 注意事項:不要返回局部變量的地址,棧區(qū)開辟的數(shù)據(jù)由編譯器自動釋放

示例:

int * func(int b)//形參數(shù)據(jù)也會存放棧區(qū)
{
        b=100;
	int a = 10;//局部變量存放棧區(qū),棧區(qū)數(shù)據(jù)在函數(shù)執(zhí)行完后自動釋放
	return &a;
}

int main() {

	int *p = func(1);

	cout << *p << endl;
	cout << *p << endl;

	system("pause");

	return 0;
}

?堆區(qū):

? 由程序員分配釋放,若程序員不釋放,程序結(jié)束時由操作系統(tǒng)回收

? 在C++中主要利用new在堆區(qū)開辟內(nèi)存

示例:

int* func()
{
        //利用new關(guān)鍵字可以將數(shù)據(jù)開辟到堆區(qū)。new int(10)返回的是10這個數(shù)據(jù)的地址
        //指針 本質(zhì)也是局部變量,指針指向堆區(qū)數(shù)據(jù)的地址,==新開辟一片存儲空間==將其地址存在棧上
	int* a = new int(10);
	return a;
}

int main() {

	int *p = func();

	cout << *p << endl;
	cout << *p << endl;
    
	system("pause");

	return 0;
}

總結(jié):

堆區(qū)數(shù)據(jù)由程序員管理開辟和釋放

堆區(qū)數(shù)據(jù)利用new關(guān)鍵字進行開辟內(nèi)存

1.3 new操作符

? C++中利用new操作符在堆區(qū)開辟數(shù)據(jù)

? 堆區(qū)開辟的數(shù)據(jù),由程序員手動開辟,手動釋放,釋放利用操作符 delete

? 語法: new 數(shù)據(jù)類型

? 利用new創(chuàng)建的數(shù)據(jù),會返回該數(shù)據(jù)對應(yīng)的類型的指針

示例1: 基本語法

int* func()
{
        //在堆區(qū)創(chuàng)建整型數(shù)據(jù)
        //new返回是 該數(shù)據(jù)類型的指針
	int* a = new int(10);//10代表創(chuàng)建的整型數(shù)據(jù)為10 
	return a;
}

int main() {

	int *p = func();

	cout << *p << endl;
	cout << *p << endl;
    //堆區(qū)的數(shù)據(jù) 由程序員管理開辟, 釋放
	//利用delete釋放堆區(qū)數(shù)據(jù)
	delete p;

	//cout << *p << endl; //報錯,釋放的空間不可訪問

	system("pause");

	return 0;
}

示例2:開辟數(shù)組

//堆區(qū)開辟數(shù)組
int main() {
        //創(chuàng)建10整型數(shù)據(jù)的數(shù)組,在堆區(qū)
	int* arr = new int[10];//10代表數(shù)組有10個元素

	for (int i = 0; i < 10; i++)
	{
		arr[i] = i + 100;
	}

	for (int i = 0; i < 10; i++)
	{
		cout << arr[i] << endl;
	}
	//釋放數(shù)組 delete 后加 []
	delete[] arr;

	system("pause");

	return 0;
}

總結(jié)

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • C++關(guān)鍵字const使用方法詳解

    C++關(guān)鍵字const使用方法詳解

    C語言中的const與C++有很大的不同,在C語言中用const修飾的變量仍是一個變量,表示這個變量是只讀的,不可顯示地更改,C++中的const關(guān)鍵字的用法非常靈活,而使用const將大大改善程序的健壯性,const關(guān)鍵字是一種修飾符
    2022-12-12
  • C語言static修飾函數(shù)詳細解析

    C語言static修飾函數(shù)詳細解析

    以下是對C語言中的static修飾函數(shù)進行了詳細的分析介紹,需要的朋友可以過來參考下
    2013-08-08
  • C++對string進行大小寫轉(zhuǎn)換操作方法

    C++對string進行大小寫轉(zhuǎn)換操作方法

    這篇文章主要介紹了C++對string進行大小寫轉(zhuǎn)換操作方法,本文通過兩種方法結(jié)合實例代碼給大家介紹的非常詳細,需要的朋友可以參考下
    2023-02-02
  • C語言的動態(tài)內(nèi)存管理你了解嗎

    C語言的動態(tài)內(nèi)存管理你了解嗎

    這篇文章主要為大家詳細介紹了C語言的動態(tài)內(nèi)存管理,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03
  • C++編譯期正則表達式操作方法

    C++編譯期正則表達式操作方法

    這篇文章介紹了STL中常用的序列容器操作算法,包括非修改序列算法和修改序列算法,以及排序、堆和數(shù)值算法等,本文通過實例代碼給大家介紹的非常詳細,感興趣的朋友跟隨小編一起看看吧
    2026-03-03
  • Qt中使用正則表達式來提取字符串等操作指南

    Qt中使用正則表達式來提取字符串等操作指南

    在Qt中使用正則表達式提取字符串是一個常見的任務(wù),下面這篇文章主要介紹了Qt中使用正則表達式來提取字符串等操作的相關(guān)資料,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2025-09-09
  • 深入理解約瑟夫環(huán)的數(shù)學(xué)優(yōu)化方法

    深入理解約瑟夫環(huán)的數(shù)學(xué)優(yōu)化方法

    本篇文章是對約瑟夫環(huán)的數(shù)學(xué)優(yōu)化方法進行了詳細的分析介紹,需要的朋友參考下
    2013-05-05
  • C++結(jié)構(gòu)體數(shù)組實現(xiàn)貪吃蛇

    C++結(jié)構(gòu)體數(shù)組實現(xiàn)貪吃蛇

    這篇文章主要為大家詳細介紹了C++結(jié)構(gòu)體數(shù)組實現(xiàn)貪吃蛇,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-03-03
  • C語言中的二叉樹和堆詳解

    C語言中的二叉樹和堆詳解

    這篇文章主要介紹了C語言中的二叉樹和堆詳解,樹是一種非線性的數(shù)據(jù)結(jié)構(gòu),它是由n(n>=0)個有限結(jié)點組成一個具有層次關(guān)系的集合,把它叫做樹是因為它看起來像一棵倒掛的樹,也就是說它是根朝上,而葉朝下的,需要的朋友可以參考下
    2023-07-07
  • 使用C++的inipp庫處理配置文件.ini的示例詳解

    使用C++的inipp庫處理配置文件.ini的示例詳解

    一個ini文件由多個節(jié)section組成,每個節(jié)由多個鍵值對組成,本文給大家介紹了使用第三方庫inipp來操作ini文件,文中通過代碼示例講解的非常詳細,需要的朋友可以參考下
    2024-01-01

最新評論

当阳市| 贵阳市| 罗源县| 修武县| 永善县| 彭水| 安仁县| 牟定县| 盘山县| 黄浦区| 祁门县| 余江县| 登封市| 谷城县| 宁都县| 连云港市| 天等县| 江北区| 天峨县| 孟连| 花莲县| 河曲县| 宁蒗| 新巴尔虎右旗| 岑溪市| 巫溪县| 兴国县| 临猗县| 宜兰县| 绥德县| 克东县| 澜沧| 大竹县| 毕节市| 郑州市| 永修县| 清涧县| 泰安市| 外汇| 江陵县| 深州市|