C++ 黑馬 內存分配模型

一,? ?內存分配模型

內存總共有四個分區

1? 代碼區
主要用來存儲二進制代碼,由操作系統進行管理

2? 棧區
由編譯器自己進行釋放和分配,例如函數的傳遞的參數,局部變量,const修飾的局部常量等等....

3? 堆區
由程序員自己分配和釋放,如果程序員沒有進行釋放,則由操作系統到最后自行釋放

4? 全局區
主要存儲全局變量,靜態常量,字符串常量和全局常量(const修飾)

分區的意義:
不同區域存放不同的數據,可以控制這些數據不同的生命周期,使得內存靈活

二,? ?代碼區和全局區

代碼區和全局區是在程序運行之前就已經開始分區了

1. 代碼區
主要存放的是CPU執行的機器指令

代碼區的特點
1? 共享性:在我們點擊編譯運行按鈕的時候都會生成一個可執行的.exe文件,這個文件進行多次點擊會彈出多個窗口,然后這里面的數據是互通公用的,計算機并不會重新開辟一個內存再次進行存儲

2? 只讀性:比如充值系統的數據是不可以隨意更改的,要是給予更改的話,商家無疑是虧損很大的,所以這個充值系統不可以隨意的更改

2. 全局區
主要存放全局變量,靜態常量,字符串常量和全局常量(const修飾)
全局變量-----不在函數體內部的變量
靜態常量-----加上static關鍵字的變量
字符串,const修飾的全局常量

以上可以根據設置變量在不同的區域,來輸出他們對應的地址來觀察判斷是否是屬于同一區域的

#include<iostream>using namespace std;//全局變量
int a;//const 修飾的全局常量
const int b1 = 0;
const int b2 = 0;int main() {//const修飾的局部變量const int a1 = 0;const int a2 = 0;//static修飾的靜態變量static int c1;static int c2;cout << "字符串地址:" << (int)&"hello world" << endl;cout << "static地址:" << (int)&c1 << endl;cout << "static地址:" << (int)&c2 << endl;cout << "const局部地址:" << (int)&a1 << endl;cout << "const局部地址:" << (int)&a2 << endl;cout << "const全局地址:" << (int)&b1 << endl;cout << "const全局地址:" << (int)&b2 << endl;}
字符串地址:995208456
static地址:995221940
static地址:995221944
const局部地址:-2081424876
const局部地址:-2081424844
const全局地址:995208112
const全局地址:995208116D:\porject\C++\x64\Debug\C++.exe (進程 3144)已退出,代碼為 0 (0x0)。
要在調試停止時自動關閉控制臺,請啟用“工具”->“選項”->“調試”->“調試停止時自動關閉控制臺”。
按任意鍵關閉此窗口. . .

可以看到運行出來的控制窗口顯示的地址字符串,static,const修飾的全局地址都是十分接近的,但是const修飾的局部地址是離很遠的,這么說明const修飾的局部變量不是在全局區

三,棧區和堆區

棧區和堆區,這兩個區域是程序運行后才產生的

1. 棧區

棧區是由編譯器自己分配和釋放的,一般都是局部變量,函數的傳參值...
注意事項:1? 不要返回局部變量的地址,棧區開辟的數據由編譯器自己決定釋放

#include<iostream>using namespace std;int* fun() {int b = 10;return &b;
}int main() {int* p = fun();cout << *p << endl;cout << *p << endl;cout << *p << endl;cout << *p << endl;cout << *p << endl;cout << *p << endl;int a = 1;cout << *p << endl;return 0;
}

當我們不用VS2022,用Dev-C++來運行這個代碼的時候,運行出來的結果是這樣的

10
0
0
0
0
0
0--------------------------------
Process exited after 0.791 seconds with return value 0
請按任意鍵繼續. . .

運行出來的結果后面都是未知量,這個時候我們可以知道,經典的C++編譯器只會給我們保留一次這個值,并不會一直保留,所以后面答應出來的值都是0

2. 堆區

堆區的知識點我們只需要知道,這個區域是我們程序員自己去釋放和開辟區域的,然后C++喜歡用new運算符來進行開辟內存和釋放內存

new運算符的使用
1.? 利用new運算符開辟一個變量并且賦值

int* p = new int(10);
delete p;

2.? 利用new運算符開辟一個數組

int* p = new int[10];
delete []p;

四,? 總結

1? 內存的分區類型

1 棧區? 2 代碼區? 3 全局區? 4 堆區

2? 每個內存分區的作用
(づ。????。)づ? 代碼區:
(a)? 主要存放二進制的機器指令
(b)? 兩個特點:共享和只讀特性

(ノ?ヮ?)ノ:・゚?? ?全局區:
(a)? 主要存放全局變量,靜態常量,const修飾的全局常量,需要注意的是const修飾的常量不是存放在全局區域,可以通過打印對應的地址來判斷他們的分區是否一致

(。・ω・。)ノ?? ? ? ?棧區:
(a)? 棧區主要是編譯器自己進行釋放和分配內存,常見的由函數傳遞的參數,局部變量...等一系列生命周期較短的變量

Σ(°△°|||)︴? ? ? ? 堆區:
(a)? 堆區主要是程序員自己進行分配和釋放內存,最后沒有釋放的內存,等到程序結束由操作系統進行釋放內存

3? new操作運算符的使用
主要就是分配變量和數組在堆區

int* p = new int(10);
delete p;
int* p = new int[10];
delete []p;

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/92645.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/92645.shtml
英文地址,請注明出處:http://en.pswp.cn/web/92645.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【華為倉頡編程語言】運行第一個倉頡程序

歡迎來到倉頡編程語言的第一個實戰課程。 上節課我們成功安裝了倉頡工具鏈&#xff0c;今天讓我們一起編寫并運行第一個倉頡程序。相信很多同學都還記得學習第一門編程語言時寫的"Hello World"程序&#xff0c;那種看到程序成功運行的激動心情。今天&#xff0c;我們…

利用DeepSeek改寫并增強測試Duckdb和sqlite的不同插入方法性能

在前文基礎上&#xff0c;好奇作為事務型數據庫的SQLite表現怎么樣&#xff0c;讓DeepSeek來幫忙。 提示詞 請仿照附件編寫用python插入sqlite數據的測試函數&#xff0c;如果sqlite3沒有對應方法就省略 import sqlite3 import pandas as pd import timemethods [字符串拼接, …

進程管理塊(PCB):操作系統進程管理的核心數據結構

進程管理塊&#xff08;PCB&#xff09;&#xff1a;操作系統進程管理的核心數據結構在現代操作系統中&#xff0c;進程管理塊&#xff08;Process Control Block, PCB&#xff09; 是內核用來描述、管理和控制進程生命周期的最核心、最關鍵的數據結構。它就像是一個進程的“身…

線程的sleep、wait、join、yield如何使用?

sleep:讓線程睡眠&#xff0c;期間會出讓cpu&#xff0c;在同步代碼塊中&#xff0c;不會釋放鎖 wait(必須先獲得對應的鎖才能調用):讓線程進 入等待狀態,釋放當前線程持有的鎖資源線程只有在notify 或者notifyAll方法調用后才會被喚醒,然后去爭奪鎖. join: 線程之間協同方式,使…

2025年服裝智能跟單系統TOP3推薦榜單

TOP1領軍者首選推薦&#xff1a;金蝶服裝系統【★★★★★】 在服裝智能跟單系統的領域&#xff0c;金蝶服裝系統憑借其強大的功能和卓越的性能脫穎而出&#xff0c;成為眾多企業的首選。盡管本文標題提及的是另一份榜單&#xff0c;但值得一提的是&#xff0c;金蝶系統若參與評…

基于FFmpeg的B站視頻下載處理

起因是這樣的一天&#xff0c;本人在B站客戶端緩存了一個視頻&#xff0c;用于學習參考等學術交流&#xff0c;但是視頻和音頻卻是分開且通過Win Hex查看發現文件頭含有9個“30”&#xff0c;想到一個個手動刪字節不如讓程序取代&#xff0c;便有了本文章這一篇文章發布之前&am…

【Vue Router】路由模式、懶加載、守衛、權限、緩存

前言 Vue Router 是 Vue 生態中處理頁面跳轉的核心工具&#xff0c;它解決了單頁應用中 URL 管理、組件切換、狀態維護等關鍵問題&#xff0c;同時提供了豐富的功能&#xff08;如動態路由、嵌套路由、路由守衛&#xff09;。除了經常用到的路由配置以外&#xff0c;我們還需了…

Linux epoll 實現詳解 (fs/eventpoll.c)

核心數據結構分析 1. struct eventpoll (epoll 實例核心結構) c struct eventpoll {struct mutex mtx; // 保護 epoll 結構的互斥鎖wait_queue_head_t wq; // epoll_wait() 使用的等待隊列wait_queue_head_t poll_wait; // 文件 poll() 使用的等待隊列struc…

【牛客刷題】小紅的項鏈(字節跳動面試題)

文章目錄 一、題目介紹 1.1 輸入描述 1.2 輸出描述 1.3 示例 二、算法設計思路 三、流程圖 四、題解實現 五、復雜度分析 六、關鍵算法知識點 一、題目介紹 原題鏈接:https://www.nowcoder.com/practice/3da065cab096478eb603bbfca5af8b02 小紅將 n n n個珠子排成一排,然后…

【Html網頁模板】HTML炫酷星空(一閃一閃亮晶晶)

文章目錄專欄導讀功能預覽快速開始核心實現拆解1. 背景與基礎布局2. 背景層靜態星空&#xff08;輕微閃爍&#xff09;3. 前景層“亮晶晶”的閃爍小星星4. 交互與動效5. 行星裝飾可配置項與個性化建議初始化順序&#xff08;入口&#xff09;源碼結語專欄導讀 &#x1f525;&am…

第一天-CAN Signal信號的Multiplexor多路復用在DBC中實現

&#x1f680; CAN總線的“變形金剛術”&#xff1a;Multiplexor多路復用信號深度揭秘在汽車電子江湖中&#xff0c;當數百個ECU爭相發送數據時&#xff0c;如何讓一條CAN報文像"變形金剛"一樣自由切換形態&#xff1f;Multiplexor&#xff08;多路復用&#xff09;技…

Code Exercising Day 10 of “Code Ideas Record“:StackQueue part02

文章目錄【150. Evaluate Reverse Polish Notation】【239. Sliding Window Maximum】【347. Top K Frequent Elements】【150. Evaluate Reverse Polish Notation】 Problem Link Approach: Use a stack. Push numbers onto the stack; when encountering an operator, pop t…

系統架構設計師備考之架構設計高級知識

1.系統架構設計基礎知識1.1.軟件架構概念軟件架構定義軟件架構&#xff08;Software Architecture&#xff09;或稱軟件體系結構&#xff0c;是指系統的一個或者多個結構&#xff0c;這些結構包括軟件的構件&#xff08;可能是程序模塊、類或者是中間件&#xff09;、構件的外部…

PWM波的頻譜分析及matlab 驗證[電路原理]

你知道嗎&#xff1f;pwm可以制作adc模塊哦&#xff01;這樣普通的gpio也能實現adc功能了。 我們嵌入式日常接觸的pwm波&#xff0c;你真的了解他嗎&#xff1f; 只有知道PWM的頻譜是怎么樣的&#xff0c;才能設計合適的濾波器&#xff0c;下面我們一起從底層數學原理來推導PWM…

相機、鏡頭參數詳解以及相關計算公式

一、工業相機參數 1、分辨率 相機每次采集圖像的像素點數&#xff0c;也是指這個相機總共有多少個感光晶片。在采集圖像時&#xff0c;相機的分辨率對檢測精度有很大的影響&#xff0c;在對同樣大的視場成像時&#xff0c;分辨率越高&#xff0c;對細節的展示越明顯。 相機像素…

通信中間件 Fast DDS(一) :編譯、安裝和測試

目錄 1.簡介 2.Windows編譯、安裝和測試 2.1.編譯環境準備 2.2.編譯安裝 2.2.1.安裝FastCDR 2.2.2.安裝Foonathan Memory 2.2.3.安裝FastDDS 2.3.驗證安裝 3.Linux編譯、安裝和測試 3.1.編譯環境準備 3.2.編譯安裝 3.2.1.安裝FastCDR 3.2.2.安裝Foonathan M…

NI USRP X410 無線電上的雷達目標仿真

此示例展示如何在 NI? USRP? 無線電的 FPGA 上部署雷達目標仿真算法。 介紹 在本例中&#xff0c;您將從 Simulink 模型入手&#xff0c;該模型可模擬最多四個雷達目標響應。您將按照分步指南&#xff0c;在 Simulink 中從該模型生成比特流&#xff0c;并使用生成的 MATLAB 主…

PyTorch 深度學習實戰教程-番外篇04:卷積層詳解與實戰指南

標簽&#xff1a;# 深度學習 #人工智能 #神經網絡 #PyTorch #卷積神經網絡 相關文章&#xff1a; 《Pytorch深度學習框架實戰教程01》 《Pytorch深度學習框架實戰教程02&#xff1a;開發環境部署》 《Pytorch深度學習框架實戰教程03&#xff1a;Tensor 的創建、屬性、操作與…

LeetCode 面試經典 150_數組/字符串_分發糖果(15_135_C++_困難)(貪心算法)

LeetCode 面試經典 150_數組/字符串_分發糖果&#xff08;15_135_C_困難&#xff09;題目描述&#xff1a;輸入輸出樣例&#xff1a;題解&#xff1a;解題思路&#xff1a;思路一&#xff08;貪心算法&#xff09;&#xff1a;代碼實現代碼實現&#xff08;思路一&#xff08;貪…

配置timer控制 IO的輸出(STC8)

使用STC8的Timer控制IO輸出 STC8系列單片機具有多個定時器&#xff0c;可以用于精確控制IO口的輸出狀態。以下是使用Timer0和Timer1控制IO輸出的方法。 初始化Timer0 配置Timer0為16位自動重裝模式&#xff0c;用于周期性控制IO輸出&#xff1a; /************************ 定時…