C++總結筆記(四)—— 堆棧區域劃分與引用實例解析

文章目錄

  • 前言😀
  • 一、概念
    • 1.1. 內存分區
      • 1.1.1 堆區
      • 1.1.2 棧區
      • 1.1.3 程序代碼區
      • 1.1.4 全局/靜態存儲區
      • 1.1.5 常量存儲區
    • 1.2. 引用
  • 二、程序示例
  • 總結


前言😀

在C++的內存管理中,堆區和棧區是一個非常重要的概念,理解堆棧的相關知識,會對如何訪問內存以及對內存中內容的調用都會有一個比較清晰的認識。而引用是一個對堆棧進行調用的實例,可以用引用的相關原理加深對堆棧的理解。

一、概念

下面對內存分區和引用的的分類和概念進行簡析。

1.1. 內存分區

在各種資料中對內存區域的劃分都有所不同,三分類,四分類,五分類都有。
三分類:靜態(全局)存儲區;棧區;堆區;
四分類:棧區;堆區;全局區(包含全局/靜態存儲區和常量存儲區);代碼區;
五分類:全局/靜態存儲區;棧區;堆區;常量存儲區;程序代碼區;
個人覺得用五分區比較全面。

1.1.1 堆區

堆區按照程序分配與釋放原則可以這樣定義:
是由程序猿🙈進行分配和釋放內存的,若程序猿啊🙉不釋放,程序結束時操作系統會進行回收。
那么哪些變量會存在堆區呢?
利用new關鍵字在內存上分配內存,用delete釋放。

int* Stack()
{int* p = new int(1);//new返回的是堆區中值為1的地址return p;
}int main()
{	int* p = Stack();cout << *p << endl;delete p;
}

1.1.2 棧區

同樣按照程序分配與釋放原則:由編譯器自動分配和釋放內存。
函數的形參局部變量都會存在在棧區。
注意:在創建函數時不要返回局部變量的地址,因為局部變量在函數調用完后會自動釋放。

1.1.3 程序代碼區

存放所有二進制代碼的區域,由操作系統進行管理,在程序運行前存在。
代碼區有共享只讀兩個屬性。

1.1.4 全局/靜態存儲區

在聲明全局變量和靜態變量時,這兩種變量會被分配到同一內存區域中。

//全局變量
int a = 1;int main()
{//局部變量int b = 2;//靜態變量static int c = 3;cout << (int)&a << endl;cout << (int)&b << endl;cout << (int)&c << endl;
}
13017144
11926456
13017148

可以看出:全局變量和靜態變量在一個內存區域,局部變量在棧區中。

1.1.5 常量存儲區

顯而易見:存儲常量的區域。包括字符串常量和全局常量。注意局部常量在局部變量的區域中。

//全局常量
const int a = 1;
//全局變量
int b = 1;int main()
{	//字符串常量cout << (int)&"A" << endl;cout << (int)&a << endl;cout << (int)&b << endl;
}
3832628
3832624
3842048

1.2. 引用

C++中引用實際上是指針常量,我們知道指針常量的概念:可以修改值,但不能改指向。所以引用就是給變量聲明另外一個名字,按照指針常量的概念,可以修改內存中的值,但是不能讓引用指向另外的內存。
引用用&符進行引用的定義。

    int a = 1;int c = 1;int &b = a;b = 2;//int& b = c;錯誤cout << b << endl;

二、程序示例

//傳遞引用
void Add(int &a, int &b)
{cout << a + b << endl;
}
//返回引用
int& Add1()
{static int c = 0;//靜態變量在堆中不會被釋放。return c;
}
//避免a和b的值被更改
int Add2(const int &a, const int &b)
{return a+b;
}int main()
{	int a = 1;int b = 2;Add(a, b);int& d = Add1();cout << d << endl;cout << d << endl;Add1() = 1;cout << d << endl;const int& f = 1;//常量引用int k = Add2(a, b);cout << k << endl;
}
3
0
0
1

總結

本文參考了如下資料:

c++堆棧–黑馬程序員筆記
C/C++程序內存的分配
C++的引用&

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

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

相關文章

學習Android MediaPlayer

Android Media Playback 原文 The Android multimedia framework includes support for playing variety of common media types, so that you can easily integrate audio, video and images into your applications. You can play audio or video from media files stored in…

spark2.0.1 安裝配置

1. 官網下載 wget http://d3kbcqa49mib13.cloudfront.net/spark-2.0.1-bin-hadoop2.7.tgz 2. 解壓 tar -zxvf spark-2.0.1-bin-hadoop2.7.tgz ln -s spark-2.0.1-bin-hadoop2.7 spark2 3. 環境變量 vi /etc/profile #Spark 2.0.1export SPARK_HOME/usr/local/spark2export PATH…

Spring Cloud各組件超時

Ribbon的超時 全局設置&#xff1a; ribbon:ReadTimeout: 60000ConnectTimeout: 60000局部設置&#xff1a; service-id:ribbon:ReadTimeout: 1000ConnectTimeout: 1000其中&#xff0c;service-id 是Ribbon所使用的虛擬主機名&#xff0c;一般和Eureka Server上注冊的服務名稱…

【圖像處理】——遍歷圖像所有像素的方法(for 循環和np.where遍歷)應用在模板制作

目錄 具體np.where的用法可以參見: 其他遍歷圖像的所有像素的方法: 模板制作流程 Python代碼

C++總結筆記(五)——構造函數和析構函數

文章目錄前言一、基本概念1 構造函數2 析構函數二、示例1. 構造函數和析構函數的簡單使用2. 拷貝構造函數的調用3. 淺拷貝和深拷貝前言 本文講述了構造函數和析構函數的概念以及對應的示例&#xff0c;以便加深理解。 一、基本概念 1 構造函數 構造函數用于初始化類的對象&a…

LINUX 更新

sudo apt-get dist-upgrade,更新所有的軟件轉載于:https://www.cnblogs.com/jackieron/p/5997805.html

python實戰===如何優雅的打飛機

這是一個打飛機的游戲&#xff0c;結構如下&#xff1a; 其中images中包含的素材為 命名為alien.png 命名為ship.png 游戲效果運行是這樣的&#xff1a; 敵軍&#xff0c;也就是體型稍微大點的&#xff0c;在上方左右移動&#xff0c;并且有規律向下移動。我軍目標&#xff0c;…

【圖像處理】——上采樣、下采樣、在模板匹配中的金字塔加速策略

目錄 1、下采樣 Python自帶函數 自定義函數 Python實現下采樣 2、上采樣 Python自帶函數 自定義函數<

C++總結筆記(六)——友元

文章目錄前言一、基本概念二、程序示例1.全局函數調用私有成員2. 外部類調用私有成員3. 外部類的成員函數調用私有成員總結前言 一、基本概念 友元是C中為了方便類外的類或者函數訪問類內私有成員而定義的一種特殊語法&#xff0c;用friend關鍵字進行修飾。 二、程序示例 友…

Java默認類型,類型轉換,常量與變量筆記

默認類型&#xff1a; 在java里整數默認是int類型&#xff0c;小數默認是double類型&#xff0c;單個字符默認是char類型&#xff0c;true、false自然默認的是boolean類型&#xff0c;字符串默認的是String類型。 變量和常量類型轉換&#xff1a; 因為有默認類型&#xff0c;在…

【圖像處理】——Python實現灰度特征提取

目錄 1、灰度特征 2、Python代碼 1、灰度特征 2、Python代碼 import cv2 import numpy as npdef gray_features(img):hist = cv2.calcHist([img],[0],None,[256],[0,255])#得到全局直方圖統計數據

C++總結筆記(七)—— 運算符重載

文章目錄一、概念二、程序示例1. 加減乘除重載2. 賦值運算符重載3. 遞增遞減運算符重載4. 關系運算符重載5. 左移運算符重載6. 函數調用運算符重載一、概念 C中運算符重載是為了實現對象之間進行各種運算的特定語法&#xff0c;在某些特定的場合起到重要的作用&#xff0c;新建…

asp.net 加載xml到menu

XML File <?xml version"1.0" encoding"utf-8" ?> <Area iAreaID "0" cAreaName"城市"><Province iAreaID "1" cAreaName"北京市"/><Province iAreaID "2" cAreaName"上海…

前端lvs訪問多臺nginx代理服務時出現404錯誤的處理

前端lvs訪問多臺nginx代理服務時出現404錯誤的處理 環境描述&#xff1a;app --> lvs --> nginx --> server app訪問頁面購買流量頁面(nginx服務器)代理到后端和服務器交互(多臺server)剛開始訪問沒有問題&#xff0c;流量變大為了避免出現問題&#xff0c;nginx配置了…

使用numpy出現DeprecationWarning: The normed argument is ignored when density is provided. 解決方法忽略警告的方法

目錄 1、從根本上進行解決 2、直接利用warning模塊忽略警告 1、從根本上進行解決 “DeprecationWarning: The normed argument is ignored when density is provided. In future passing both will result in an error.” 這種一般是因為函數庫或者是一些包package版本更新而…

iptables四個表與五個鏈間的處理關系

轉載自&#xff1a;http://www.linuxidc.com/Linux/2012-08/67505.htm netfilter/iptables IP 信息包過濾系統是一種功能強大的工具&#xff0c;可用于添加、編輯和除去規則&#xff0c;這些規則是在做信息包過濾決定時&#xff0c;防火墻所遵循和組成的規則。 這些規則存儲在專…

C++總結筆記(八)—— 菱形繼承

文章目錄一、基本概念二、程序舉例1. 虛繼承2. 內在邏輯一、基本概念 菱形繼承是指存在兩個子類繼承自同一個基類&#xff0c;同時有子類繼承這兩個子類。 二、程序舉例 1. 虛繼承 使用虛繼承可以解決菱形繼承資源浪費的問題&#xff0c;因為有兩個子類繼承基類&#xff0c…

Linux命令:mkdir

全稱&#xff1a;make directories 用途&#xff1a;創建新目錄 格式&#xff1a;mkdir [OPTION]... DIRECTORY... 類型&#xff1a;mkdir is hashed (/bin/mkdir) 說明&#xff1a; 創建文件目錄&#xff0c;較常用的選項參數有兩個&#xff1a; -m, --modeMODE&#xff1a;直…

InnoDB引擎與MyIASM的一點總結

InnoDB引擎&#xff1a; 提供了對數據庫ACID事務的支持&#xff0c;并且實現了SQL標準的四種隔離級別 提供了行級鎖和外鍵約束。 它的設計的目標是處理大容量數據庫系統&#xff0c;用于緩沖數據和索引。 不支持FULLTEXT類型的數據&#xff0c;沒有保存表的行數&#xff0c;當s…

C++總結筆記(九)—— 多態

文章目錄一、多態是什么&#xff1f;二、使用步驟2.1. 靜態多態2.1.1 函數重載2.1.2 模板2.2.動態多態2.2.1 示例2.2.2 原理分析總結一、多態是什么&#xff1f; 多態是面向對象的語言中都必須掌握的特性&#xff0c;其概念簡單講就是對同一種特性的方法有不同的實現功能&…