C++程序代碼的五大內存分區(qū)方式
C++程序代碼的五大內存分區(qū)
在講分區(qū)前,我們首先要了解程序運行的四個過程:

預編譯
預編譯主要完成以下三個具體任務:
- (1)把include中的頭文件復制到要編譯的源文件中
- (2)用實際值代替define文本
- (3)在調用宏的地方進行宏替換
編譯
編譯的主要功能包括兩個部分,第一部分是檢查代碼的語法,如果語法錯誤則給出錯誤提示并結束編譯,只有在代碼無語法錯誤的情況下才能進入大二部分。
第二部分是將預編譯后的文件轉換為匯編語言。
匯編
匯編的主要功能是將匯編語言代碼變成目標代碼(機器代碼)
但不進行連接,并生成目標文件,即二進制文件
連接
連接的主要功能是連接目標代碼,并生成可執(zhí)行文件。
五大內存分區(qū)分別是:棧區(qū),堆區(qū),BSS區(qū),數(shù)據(jù)區(qū),代碼區(qū)
1.棧區(qū)
由編譯器自動分配釋放,存放函數(shù)的參數(shù)值、返回值和局部變量
在程序運行過程中實施分配和釋放,棧區(qū)由操作系統(tǒng)自動管理,無需程序員手動管理。
2.堆區(qū)
堆是由malloc()函數(shù)或者new分配的內存塊,使用free或delete來釋放內存
堆的申請和釋放由程序員控制,容易導致內存泄漏,導致后面代碼無法訪問這片內存區(qū)域,程序退出后系統(tǒng)自動回收。
3.BSS區(qū)
即Block Started by Symbol
存放的是未初始化的全局變量和未初始化的靜態(tài)變量。
4.data區(qū)
即數(shù)據(jù)區(qū)
存放已初始化的全局變量、靜態(tài)變量和常量數(shù)據(jù)。
5.代碼區(qū)
存放cpu執(zhí)行的機器指令,代碼區(qū)是可共享,并且是只讀的。
以下是從網(wǎng)上找的一個例子,看例子能夠更直觀的了解各行代碼在內存中的處在哪個區(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ū),臨時變量
char s[] = "asd"; //棧區(qū),臨時變量
char *p2 = "123"; //123是字符串常量,在data區(qū),p2在棧區(qū)
static int c = 0; //c是已初始化靜態(tài)變量,在data區(qū)
const int d = 0; //棧區(qū),const修飾的變量對存放位置沒有影響不要被誤導!??!
static const int e; //data區(qū)
p1 = (char *)malloc(10);//分配10個字節(jié)在堆區(qū)
return a.exec();
}
補充
static全局變量和普通全局變量的區(qū)別:
- static全局變量只初始化一次,只能在當前文件下使用
- 普通全局變量可以在別的文件中加extern使用
static局部變量和普通局部變量的區(qū)別:
- static局部變量只被初始化一次,下一次使用的初始值為上一次的結果值
- 普通局部變量如果在函數(shù)中或者在循環(huán)中,當函數(shù)或者循環(huán)結束后也就被回收
總結
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
C++ 隨機數(shù)字以及隨機數(shù)字加字母生成的案例
這篇文章主要介紹了C++ 隨機數(shù)字以及隨機數(shù)字加字母生成的案例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-12-12

