【C++】內存分區

目錄

    • 內存分區
      • 代碼運行前后區別
      • 各分區詳細解釋
      • C++內存申請和釋放

內存分區

不同的操作系統對程序內存的管理和劃分會有所不同。

此處是C++內存區域劃分主要是針對通用的情況,并不限定在某個特定操作系統上

一般分為4個區(有時把全局區拆分成數據區+未初始化數據區,就是五個區)

image-20240601170259028

代碼區:存放CPU 可執行的機器指令

全局區(靜態區):存放全局變量,靜態變量,常量(又分為數據區+未初始化數據區)
:程序員自己管理申請和釋放的內存

:編譯器管理申請和釋放的內存,一般是函數形參,局部變量


代碼運行前后區別

運行前

程序源代碼被編譯之后主要分成兩種段:程序指令(代碼區)和程序數據(數據區)。代碼段屬于程序指令,而數據域段和 bss 段屬于程序數據。

在沒有運行程序前(程序沒有加載到內存前),內存分為代碼區(text)、數據區(data)和未初始化數據區(bss)3 個部分(把 data 和 bss 合起來叫做靜態區或全局區)。

運行后

運行后內存分為5個區:代碼區+數據區+未初始化數據區+棧區+堆區

程序在加載到內存前,代碼區和全局區(data+ bss)的大小就是固定的,程序運行期間不能改變。然后,運行可執行程序,操作系統把物理硬盤程序加載到內存,除了根據可執行程序的信息分出代碼區(text)、數據區(data)和未初始化數據區(bss)之外,還額外增加了棧區、堆區。


各分區詳細解釋

代碼區(text段)

代碼區通常是可“共享”的,可以被多個程序調用,這樣有利于節省內存,對于需要頻繁被執行的程序,只需要在內存中有一份即可

代碼區是只讀的,防止程序意外的修改了它的指令。另外,代碼區還規劃了局部變量的相關信息。

程序運行時,內存的代碼區加載的是可執行文件代碼段,所有的可執行代碼都加載到代碼區,這塊內存是不可以在運行期間修改的。

數據區(又叫全局初始化數據區/靜態數據區)(data段)

包含被初始化的全局變量、已初始化的靜態變量(包括全局靜態變量)和常量數據(如字符串常量)。

程序運行時,加載的是可執行文件數據段,存儲于數據段(全局初始化,靜態初始化數據,文字常量(只讀))的數據生存周期是整個程序運行過程。

未初始化數據區(又叫 bss 段)

存入的是全局未初始化靜態變量。未初始化數據區的數據在程序開始執行之前被內核初始化為 0 或者空(NULL)。

程序運行時,加載的是可執行文件 BSS 段,位置可以分開也可以緊靠數據段,存儲于數據段的數據(全局未初始化,靜態未初始化數據)生存周期是整個程序運行過程。

棧區(stack)

程序運行后才被分配堆棧區

棧是由編譯器自動分配釋放,存放函數的參數值、返回值、局部變量等。在程序運行過程中實時加載和釋放,因此,局部變量的生存周期為申請到釋放該段棧空間。

堆區(heap)

程序運行后才被分配堆棧區

堆是一個大容器,它的容量要遠遠大于棧,但沒有棧那樣先進后出的順序。用于動態內存分配。堆在內存中位于 BSS 區和棧區之間。一般由程序員分配和釋放,若程序員不釋放,程序結束時可能會由操作系統回收。

補充:為什么把程序的指令和程序數據分開呢?

程序被加載到內存中之后,可以將數據和代碼分別映射到兩個內存區域。由于數據區域對進程來說是可讀可寫的,而指令區域對程序來講是只讀的,所以分區之后呢,可以將程序指令區域和數據區域分別設置成只讀或可讀可寫。這樣可以防止程序的指令有意或者無意被修改。

當系統中運行著多個同樣的程序的時候,這些程序執行的指令都是一樣的,所以只需要內存中保存一份程序的指令就可以了,只是每一個程序運行中數據不一樣而已,這樣可以節省大量的內存。

C++內存申請和釋放

//申請內存
int* a = new int(10);//申請一片內存存放int型數據10
int* arr = new int[10];//申請一個長度為10的int型數組//釋放內存
delete a;
delete[] arr;//釋放數組

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

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

相關文章

git 命令學習之branch 和 tag 操作

引言 在項目一個迭代過程結束之時,或是一個版本發布之后,我們要進行 新版本的開發,這時就需要對原來的項目代碼進行封存,以及新項目代碼的開始,這時就需要用到 branch 和 tag 操作。下面簡單說說對這兩個操作的理解。…

微服務之服務保護策略【持續更新】

文章目錄 線程隔離一、滑動窗口算法二、漏桶算法三、令牌桶算法 面試題1、Sentinel 限流和Gateway限流的區別 線程隔離 兩種實現方式 線程池隔離(Hystix隔離),每個被隔離的業務都要創建一個獨立的線程池,線程過多會帶來額外的CPU…

【C語言】C語言-體育彩票的模擬生成和兌獎(源碼+論文)【獨一無二】

👉博__主👈:米碼收割機 👉技__能👈:C/Python語言 👉公眾號👈:測試開發自動化【獲取源碼商業合作】 👉榮__譽👈:阿里云博客專家博主、5…

【涵子來信科技潮流】——WWDC24回顧與暑假更新說明

期末大關,即將來襲。在期末之前,我想發一篇文章,介紹有關WWDC24的內容和暑假中更新的說明。本篇文章僅為個人看法和分享,如需了解更多詳細內容,請通過官方渠道或者巨佬文章進行進一步了解。 OK, Lets go. 一、WWDC24 …

Linux grep技巧 刪除含有指定關鍵詞的行,創建新文件

一. 需求 ?有如下文件,現要求 刪除含有xuecheng關鍵字的行刪除含有192.168.1.1關鍵字的行也就是說,最終只會留下127.0.0.1 license.sublimehq.com 127.0.0.1 www.xuecheng.com 127.0.0.1 img.xuecheng.com 192.168.1.1 www.test.com 127.0.0.1 video…

力扣每日一題 6/30 記憶化搜索/動態規劃

博客主頁:誓則盟約系列專欄:IT競賽 專欄關注博主,后期持續更新系列文章如果有錯誤感謝請大家批評指出,及時修改感謝大家點贊👍收藏?評論? 494.目標和【中等】 題目: 給你一個非負整數數組 nums 和一個…

VMware17.0 安裝過程

VMware17.0 VMware 17.0 是一款功能強大的虛擬機軟件,用于在計算機上創建和管理虛擬機。它能夠同時運行多個操作系統,如 Windows、Linux 等,并且在這些虛擬機之間提供無縫的切換和共享功能。 VMware 17.0 支持最新的硬件和操作系統&#xf…

Chrome瀏覽器web調試(js調試、css調試、篡改前置)

目錄 1. 打開開發者工具(Dev Tool) 2. 打開命令菜單 截圖 3. 面板介紹 4. CSS調試 右鍵檢查快速到達元素處 查找DOM數 利用面板Console查找DOM節點 內置函數查找上一個選擇點擊的元素 5. 調試JS代碼(Javascript調試) 日志調試 選擇查看日志等級 眼睛觀測變量 …

【Leetcode 67 Easy】二進制求和

目錄 題目描述: 整體思路: 具體代碼: 題目描述: 原題地址 給你兩個二進制字符串 a 和 b ,以二進制字符串的形式返回它們的和。 示例 1: 輸入:a "11", b "1" 輸出:&qu…

ubuntu 18 虛擬機安裝(4)安裝 postgres sql 數據庫

ubuntu 18 虛擬機安裝(4)安裝 postgres sql 數據庫 如何查看PostgreSQL的版本 https://blog.csdn.net/lee_vincent1/article/details/138731465 postgres 查看全部數據庫 https://blog.csdn.net/xie__jin__cheng/article/details/138653002 Ubuntu18.04…

數據資產鑄就市場競爭優勢:運用先進的數據分析技術,精準把握市場脈搏,構建獨特的競爭優勢,助力企業實現市場領先地位,贏得持續成功

目錄 一、引言 二、數據資產的重要性 三、先進數據分析技術的應用 1、大數據分析技術 2、人工智能與機器學習 3、數據可視化技術 四、精準把握市場脈搏 1、深入了解客戶需求 2、預測市場趨勢 3、優化資源配置 五、構建獨特的競爭優勢 1、定制化產品和服務 2、精準營…

數據結構—判斷題

1.數據的邏輯結構說明數據元素之間的順序關系,它依賴于計算機的存儲結構。 答案:錯誤 2.(neuDS)在順序表中邏輯上相鄰的元素,其對應的物理位置也是相鄰的。 答案:正確 3.若一個棧的輸入序列為{1, 2, 3, 4, 5},則不…

nginx上傳文件限制

默認限制 Nginx 限制文件大小可以通過 client_max_body_size 指令來設置,該指令通常在 http、server 或 location 塊中設置,如果不設置,默認上傳大小為1M。 修改上傳文件限制 要修改Nginx的文件上傳大小限制,你需要編輯Nginx的配…

接口自動化測試關聯token的方法?

引言: 在接口自動化測試中,有時候我們需要關聯token來進行身份驗證或權限管理。本文將從零開始,介紹如何詳細且規范地實現接口自動化測試中token的關聯。 步驟一:準備工作 在開始之前,我們需要確保以下準備工作已完成…

如何在 Linux 中后臺運行進程?

一、后臺進程 在后臺運行進程是 Linux 系統中的常見要求。在后臺運行進程允許您在進程獨立運行時繼續使用終端或執行其他命令。這對于長時間運行的任務或當您想要同時執行多個命令時特別有用。 在深入研究各種方法之前,讓我們先了解一下什么是后臺進程。在 Linux 中…

Kafka~特殊技術細節設計:分區機制、重平衡機制、Leader選舉機制、高水位HW機制

分區機制 Kafka 的分區機制是其實現高吞吐和可擴展性的重要特性之一。 Kafka 中的數據具有三層結構,即主題(topic)-> 分區(partition)-> 消息(message)。一個 Kafka 主題可以包含多個分…

3-linux命令行與基本命令

目錄 什么是shell linux命令 命令組成 幾個簡單的命令 linux文件系統導航 什么是shell linux學習路徑:學習shell→配置和環境→見任務和主要工具→編寫shell腳本 shell是一個接收由鍵盤輸入的命令,并將其傳遞給操作系統來執行的程序。幾乎所有…

C++學習全教程(Day2)

一、數組 在程序中為了處理方便,常常需要把具有相同類型的數據對象按有序的形式排列起來,形成“一組”數據,這就是“數組”(array) 數組中的數據,在內存中是連續存放的,每個元素占據相同大小的空間,就像排…

【Spring】DAO 和 Repository 的區別

DAO 和 Repository 的區別 1.概述2.DAO 模式2.1 User2.2 UserDao2.3 UserDaoImpl 3.Repository 模式3.1 UserRepository3.2 UserRepositoryImpl 4.具有多個 DAO 的 Repository 模式4.1 Tweet4.2 TweetDao 和 TweetDaoImpl4.3 增強 User 域4.4 UserRepositoryImpl 5.比較兩種模式…