C++程序代碼的五大內(nèi)存分區(qū)方式
C++程序代碼的五大內(nèi)存分區(qū)
在講分區(qū)前,我們首先要了解程序運(yùn)行的四個(gè)過(guò)程:
預(yù)編譯
預(yù)編譯主要完成以下三個(gè)具體任務(wù):
- (1)把include中的頭文件復(fù)制到要編譯的源文件中
- (2)用實(shí)際值代替define文本
- (3)在調(diào)用宏的地方進(jìn)行宏替換
編譯
編譯的主要功能包括兩個(gè)部分,第一部分是檢查代碼的語(yǔ)法,如果語(yǔ)法錯(cuò)誤則給出錯(cuò)誤提示并結(jié)束編譯,只有在代碼無(wú)語(yǔ)法錯(cuò)誤的情況下才能進(jìn)入大二部分。
第二部分是將預(yù)編譯后的文件轉(zhuǎn)換為匯編語(yǔ)言。
匯編
匯編的主要功能是將匯編語(yǔ)言代碼變成目標(biāo)代碼(機(jī)器代碼)
但不進(jìn)行連接,并生成目標(biāo)文件,即二進(jìn)制文件
連接
連接的主要功能是連接目標(biāo)代碼,并生成可執(zhí)行文件。
五大內(nèi)存分區(qū)分別是:棧區(qū),堆區(qū),BSS區(qū),數(shù)據(jù)區(qū),代碼區(qū)
1.棧區(qū)
由編譯器自動(dòng)分配釋放,存放函數(shù)的參數(shù)值、返回值和局部變量
在程序運(yùn)行過(guò)程中實(shí)施分配和釋放,棧區(qū)由操作系統(tǒng)自動(dòng)管理,無(wú)需程序員手動(dòng)管理。
2.堆區(qū)
堆是由malloc()函數(shù)或者new分配的內(nèi)存塊,使用free或delete來(lái)釋放內(nèi)存
堆的申請(qǐng)和釋放由程序員控制,容易導(dǎo)致內(nèi)存泄漏,導(dǎo)致后面代碼無(wú)法訪問(wèn)這片內(nèi)存區(qū)域,程序退出后系統(tǒng)自動(dòng)回收。
3.BSS區(qū)
即Block Started by Symbol
存放的是未初始化的全局變量和未初始化的靜態(tài)變量。
4.data區(qū)
即數(shù)據(jù)區(qū)
存放已初始化的全局變量、靜態(tài)變量和常量數(shù)據(jù)。
5.代碼區(qū)
存放cpu執(zhí)行的機(jī)器指令,代碼區(qū)是可共享,并且是只讀的。
以下是從網(wǎng)上找的一個(gè)例子,看例子能夠更直觀的了解各行代碼在內(nèi)存中的處在哪個(gè)區(qū)
代碼如下:
#include <QCoreApplication> #include <iostream> #include<unistd.h> using namespace std; int a=0; //在data區(qū),已初始化的全局變量 char *p1; //在BSS區(qū),未初始化的全局變量 int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); int b; //棧區(qū),臨時(shí)變量 char s[] = "asd"; //棧區(qū),臨時(shí)變量 char *p2 = "123"; //123是字符串常量,在data區(qū),p2在棧區(qū) static int c = 0; //c是已初始化靜態(tài)變量,在data區(qū) const int d = 0; //棧區(qū),const修飾的變量對(duì)存放位置沒(méi)有影響不要被誤導(dǎo)?。?! static const int e; //data區(qū) p1 = (char *)malloc(10);//分配10個(gè)字節(jié)在堆區(qū) return a.exec(); }
補(bǔ)充
static全局變量和普通全局變量的區(qū)別:
- static全局變量只初始化一次,只能在當(dāng)前文件下使用
- 普通全局變量可以在別的文件中加extern使用
static局部變量和普通局部變量的區(qū)別:
- static局部變量只被初始化一次,下一次使用的初始值為上一次的結(jié)果值
- 普通局部變量如果在函數(shù)中或者在循環(huán)中,當(dāng)函數(shù)或者循環(huán)結(jié)束后也就被回收
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
C語(yǔ)言實(shí)現(xiàn)字母大小寫(xiě)轉(zhuǎn)換的方法
這篇文章主要介紹了C語(yǔ)言實(shí)現(xiàn)字母大小寫(xiě)轉(zhuǎn)換的方法,涉及C語(yǔ)言字符串的遍歷與轉(zhuǎn)換技巧,非常簡(jiǎn)單實(shí)用,需要的朋友可以參考下2015-07-07C++實(shí)現(xiàn)簡(jiǎn)單校園導(dǎo)游系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)簡(jiǎn)單校園導(dǎo)游系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03C++根據(jù)傳入的函數(shù)指針來(lái)解析需要的參數(shù)(推薦)
C++可以根據(jù)傳入的函數(shù)指針,獲取自己需要的參數(shù)類型,然后根據(jù)參數(shù)源中獲取需要的參數(shù),具體實(shí)現(xiàn)方式大家參考下本文2018-05-05C++實(shí)現(xiàn)圖的鄰接表存儲(chǔ)和廣度優(yōu)先遍歷實(shí)例分析
這篇文章主要介紹了C++實(shí)現(xiàn)圖的鄰接表存儲(chǔ)和廣度優(yōu)先遍歷,實(shí)例分析了C++實(shí)現(xiàn)圖的存儲(chǔ)與遍歷技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2015-04-04C++內(nèi)存四區(qū)之代碼區(qū)、全局區(qū)、棧區(qū)和堆區(qū)
C++編譯器會(huì)把代碼直接分為四個(gè)小區(qū),弄懂這四小區(qū)對(duì)我們理解內(nèi)存有所幫助,所以下面這篇文章主要給大家介紹了關(guān)于C++內(nèi)存四區(qū)之代碼區(qū)、全局區(qū)、棧區(qū)和堆區(qū)的相關(guān)資料,需要的朋友可以參考下2021-07-07C++實(shí)現(xiàn)LeetCode(30.串聯(lián)所有單詞的子串)
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(30.串聯(lián)所有單詞的子串),本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07Ubuntu系統(tǒng)下如何在VScode配置OpenCV(C++)環(huán)境(.json文件)
這篇文章主要介紹了如何在VSCode中配置和運(yùn)行C++程序,包括創(chuàng)建test.cpp文件、配置launch.json、tasks.json和c_cpp_properties.json文件,以及重啟VSCode以解決可能的報(bào)錯(cuò)問(wèn)題,需要的朋友可以參考下2025-02-02