最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解C++的靜態(tài)內(nèi)存分配與動(dòng)態(tài)內(nèi)存分配

 更新時(shí)間:2023年06月28日 09:49:45   作者:Loup&卡普  
內(nèi)存分配 (Memory Allocation) 是指為計(jì)算機(jī)程序或服務(wù)分配物理內(nèi)存空間或虛擬內(nèi)存空間的一個(gè)過程,本文主要介紹了C++的靜態(tài)內(nèi)存分配與動(dòng)態(tài)內(nèi)存分配,感興趣的同學(xué)可以參考閱讀

I - 內(nèi)存分配概述

1.1 - 定義概述

內(nèi)存分配 (Memory Allocation) 是指為計(jì)算機(jī)程序或服務(wù)分配物理內(nèi)存空間或虛擬內(nèi)存空間的一個(gè)過程。通常在程序執(zhí)行前或執(zhí)行時(shí)完成內(nèi)存分配。

1.2 - 分類概述

存在兩種類型的內(nèi)存分配:

  • 編譯時(shí)內(nèi)存分配或靜態(tài)內(nèi)存分配 (Compile-time or Static Memory Allocation)
  • 運(yùn)行時(shí)內(nèi)存分配或動(dòng)態(tài)內(nèi)存分配 (Run-time or Dynamic Memory Allocation)

靜態(tài)內(nèi)存分配

靜態(tài)內(nèi)存分配是由編譯器為聲明的變量分配內(nèi)存。內(nèi)存的地址可以通過地址操作符找到,并且可以賦值給指針變量。該內(nèi)存是在編譯時(shí)分配的。

動(dòng)態(tài)內(nèi)存分配 :

在程序執(zhí)行時(shí) (execution) 或 運(yùn)行時(shí) (run-time) 進(jìn)行的內(nèi)存分配被稱為動(dòng)態(tài)內(nèi)存分配。庫函數(shù)例如 calloc() 和 malloc() 或者操作符 new 均支持分配動(dòng)態(tài)內(nèi)存。動(dòng)態(tài)分配的內(nèi)存空間,通過這些函數(shù)或操作符的返回值分配,賦值給指針變量。

1.3 - 區(qū)別概述

序號(hào)靜態(tài)內(nèi)存分配動(dòng)態(tài)內(nèi)存分配
1在靜態(tài)內(nèi)存分配中,變量被永久地分配內(nèi)存,直到程序執(zhí)行結(jié)束/函數(shù)調(diào)用結(jié)束在動(dòng)態(tài)內(nèi)存分配中,只有當(dāng)你的程序單元被激活時(shí)才會(huì)為變量分配內(nèi)存
2靜態(tài)內(nèi)存分配在程序執(zhí)行前完成動(dòng)態(tài)內(nèi)存分配在程序執(zhí)行過程中完成
3使用棧來管理靜態(tài)分配的內(nèi)存使用堆來管理動(dòng)態(tài)分配的內(nèi)存
4較不高效 (less efficient)較高效
5在靜態(tài)內(nèi)存分配中,不存在內(nèi)存的重用在動(dòng)態(tài)內(nèi)存分配中,存在內(nèi)存的重用,而且在不需要時(shí)可以內(nèi)存可以被釋放
6在靜態(tài)內(nèi)存分配中,一旦內(nèi)存被分配,內(nèi)存大小就不能再改變在動(dòng)態(tài)內(nèi)存分配中,分配了內(nèi)存后,內(nèi)存的大小可以改變
7在靜態(tài)內(nèi)存分配方案中,我們不能重新使用未使用的內(nèi)存動(dòng)態(tài)內(nèi)存分配中,允許重復(fù)使用內(nèi)存。用戶可以在需要時(shí)分配更多的內(nèi)存。同時(shí),用戶也可以在需要時(shí)釋放內(nèi)存。
8在這種內(nèi)存分配方案中,執(zhí)行速度比動(dòng)態(tài)內(nèi)存分配要快在這種內(nèi)存分配方案中,執(zhí)行速度要比靜態(tài)內(nèi)存分配慢
9編譯時(shí)內(nèi)存分配運(yùn)行時(shí)內(nèi)存分配
10靜態(tài)分配的內(nèi)存從程序開始保持到程序結(jié)束動(dòng)態(tài)分配的內(nèi)存可以在任意時(shí)刻釋放
11靜態(tài)的內(nèi)存分配常常用于數(shù)組等動(dòng)態(tài)的內(nèi)存分配常常用于鏈表等數(shù)據(jù)結(jié)構(gòu)

II - 靜態(tài)內(nèi)存分配

內(nèi)存必須被分配給我們所創(chuàng)建的變量,這樣實(shí)際的變量才能存在?,F(xiàn)在有一個(gè)問題,即我們認(rèn)為它是如何運(yùn)行的,以及它實(shí)際上是如何運(yùn)行的?

計(jì)算機(jī)如何創(chuàng)建一個(gè)變量?

當(dāng)我們思考如何創(chuàng)造某樣?xùn)|西時(shí),我們會(huì)想到“從零開始”著手干,而當(dāng)計(jì)算機(jī)創(chuàng)建一個(gè)變量 ‘X’ 時(shí),實(shí)際上情況并不是這樣;對(duì)于計(jì)算機(jī)而言,更像是一種分配,計(jì)算機(jī)只是從許多預(yù)先存在的內(nèi)存單元中分配一個(gè)內(nèi)存單元給 X。

那么什么是靜態(tài)內(nèi)存分配?當(dāng)我們聲明變量時(shí),我們實(shí)際上是在準(zhǔn)備所有會(huì)被使用的變量,這樣編譯器就知道被使用的變量實(shí)際上是用戶想要的程序的重要部分,而不是到處漂浮的流氓符號(hào)。因此,當(dāng)我們聲明變量時(shí),編譯器實(shí)際做的是將這些變量分配到它們的房間(一個(gè)內(nèi)存單元)。現(xiàn)在,可以看出,這是在程序執(zhí)行前完成的,你不能在程序執(zhí)行時(shí)用這種方法分配變量。

示例

void func()
{
	int a;
}
int main()
{
	int b;
	int c[12];
	//...
}

上述代碼中所有的變量都是靜態(tài)分配的。

III - 動(dòng)態(tài)內(nèi)存分配

那么,既然已經(jīng)存在一種方式來完成內(nèi)存分配的工作,為什么我們需要引入另一種分配方法?為什么我們需要在程序執(zhí)行過程中分配內(nèi)存?

因?yàn)?,盡管不是很顯而易見,但不能在運(yùn)行時(shí)分配內(nèi)存,就降低了靈活性,并與空間效率相妥協(xié)。特別是,在那些事先不知道輸入的情況下,我們會(huì)在存儲(chǔ)的低效使用和缺乏或過多的空間用來輸入數(shù)據(jù)方面受到影響(給定一個(gè)固定長(zhǎng)度的數(shù)組或類似的數(shù)據(jù)結(jié)構(gòu)來存儲(chǔ)數(shù)據(jù))。

所以引入動(dòng)態(tài)內(nèi)存分配: 在運(yùn)行時(shí),存儲(chǔ)/內(nèi)存/單元可以分配給變量的機(jī)制被稱為動(dòng)態(tài)內(nèi)存分配(不要與 DMA 相混淆)。因此,我們可以知道在運(yùn)行期間分配內(nèi)存,這使我們能夠使用我們想要的存儲(chǔ),而不用擔(dān)心任何浪費(fèi)或者不足。

為什么要使用動(dòng)態(tài)分配的原因

  • 當(dāng)我們事先不知道程序需要多少內(nèi)存的時(shí);
  • 當(dāng)我們希望數(shù)據(jù)結(jié)構(gòu)沒有固定的內(nèi)存空間上限時(shí);
  • 當(dāng)你想更有效地使用你的內(nèi)存空間時(shí)。例如: 如果你為一個(gè)一維數(shù)組分配的內(nèi)存空間是 array[20],而你最終只使用了 10 個(gè)內(nèi)存空間,那么剩下的 10 個(gè)內(nèi)存空間就被浪費(fèi)了,這些浪費(fèi)的內(nèi)存甚至不能被其他程序變量所使用;
  • 動(dòng)態(tài)創(chuàng)建的列表的插入和刪除可以非常容易地通過操作地址來完成,而在靜態(tài)分配的內(nèi)存中,插入和刪除會(huì)導(dǎo)致更多的移動(dòng)和內(nèi)存浪費(fèi);
  • 當(dāng)你想在編程中使用結(jié)構(gòu)和鏈表的概念時(shí),動(dòng)態(tài)內(nèi)存分配是必須的

C++ 代碼

int main(int argc, char* argv[])
{
	// 動(dòng)態(tài)內(nèi)存分配
	int* ptr = new int;
	int* ptr1 = new int[10];
	// 動(dòng)態(tài)分配內(nèi)存的釋放
	delete ptr;
	delete [] ptr1;
}

C 代碼

ptr = calloc(m, n);

等價(jià)于

ptr = malloc(m * n);
memset(ptr, 0, m * n);

IV - 小結(jié)

有兩種類型的可用內(nèi)存 – 棧 (stack) 和堆 (heap)。靜態(tài)內(nèi)存分配只能在棧上進(jìn)行,而動(dòng)態(tài)內(nèi)存分配可以在棧和堆上進(jìn)行。在堆上進(jìn)行動(dòng)態(tài)分配的一個(gè)例子是遞歸,在遞歸中,函數(shù)按照出現(xiàn)的順序被放入調(diào)用堆,并在到達(dá)基數(shù)時(shí)一個(gè)一個(gè)地彈出。

當(dāng)在堆上分配內(nèi)存時(shí),我們需要手動(dòng)刪除內(nèi)存,因?yàn)榧词狗峙涞膬?nèi)存范圍結(jié)束(如棧的情況),內(nèi)存也不會(huì)被編譯器自己釋放(取消分配 deallocate)。

4.1 - 靜態(tài)分配的優(yōu)缺點(diǎn)

優(yōu)點(diǎn)

  • 使用簡(jiǎn)單
  • 分配和取消分配都由編譯器完成
  • 高效的執(zhí)行時(shí)間
  • 它使用棧數(shù)據(jù)結(jié)構(gòu)

缺點(diǎn)

  • 內(nèi)存浪費(fèi)問題
  • 必須知道確切的內(nèi)存需求
  • 一旦初始化后,內(nèi)存的大小不能調(diào)整

4.2 - 動(dòng)態(tài)分配的優(yōu)缺點(diǎn)

優(yōu)點(diǎn)

  • 動(dòng)態(tài)分配是在運(yùn)行時(shí)進(jìn)行的
  • 只要我們需要,我們就可以分配(創(chuàng)建)額外的存儲(chǔ)
  • 只要我們使用結(jié)束了,內(nèi)存就可以被取消分配(free / delete)動(dòng)態(tài)空間
  • 因此,人們總是可以準(zhǔn)確地?fù)碛兴璧目臻g量–不多也不少。
  • 如果需要,內(nèi)存大小可以重新分配 

缺點(diǎn)

  • 由于內(nèi)存是在運(yùn)行時(shí)分配的,因此需要更多的時(shí)間。
  • 當(dāng)完成后,內(nèi)存需要由用戶釋放。這一點(diǎn)很重要,因?yàn)樗锌赡茏兂呻y以發(fā)現(xiàn)的 bug。

總上所述,靜態(tài)內(nèi)存是編譯器提前分配的東西。而動(dòng)態(tài)內(nèi)存是在執(zhí)行過程中由程序控制的東西。程序可以要求更多的內(nèi)存,也可以刪除部分分配的內(nèi)存。

到此這篇關(guān)于詳解C++的靜態(tài)內(nèi)存分配與動(dòng)態(tài)內(nèi)存分配的文章就介紹到這了,更多相關(guān)C++ 內(nèi)存分配內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C語言數(shù)據(jù)結(jié)構(gòu)線性表教程示例詳解

    C語言數(shù)據(jù)結(jié)構(gòu)線性表教程示例詳解

    這篇文章主要為大家介紹了C語言數(shù)據(jù)結(jié)構(gòu)線性表的示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-02-02
  • C++簡(jiǎn)單實(shí)現(xiàn)Dijkstra算法

    C++簡(jiǎn)單實(shí)現(xiàn)Dijkstra算法

    這篇文章主要為大家詳細(xì)介紹了C++簡(jiǎn)單實(shí)現(xiàn)Dijkstra算法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-05-05
  • C語言實(shí)現(xiàn)3*3數(shù)組對(duì)角線之和示例

    C語言實(shí)現(xiàn)3*3數(shù)組對(duì)角線之和示例

    今天小編就為大家分享一篇C語言實(shí)現(xiàn)3*3數(shù)組對(duì)角線之和示例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2019-12-12
  • C語言代碼實(shí)現(xiàn)簡(jiǎn)單掃雷游戲

    C語言代碼實(shí)現(xiàn)簡(jiǎn)單掃雷游戲

    這篇文章主要為大家詳細(xì)介紹了C語言代碼實(shí)現(xiàn)簡(jiǎn)單掃雷游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-02-02
  • Python HTTP服務(wù)搭建顯示本地文件

    Python HTTP服務(wù)搭建顯示本地文件

    這篇文章主要介紹了Python HTTP服務(wù)搭建顯示本地文件的相關(guān)資料,需要的朋友可以參考下
    2017-02-02
  • C語言實(shí)現(xiàn)影院管理系統(tǒng)程序設(shè)計(jì)

    C語言實(shí)現(xiàn)影院管理系統(tǒng)程序設(shè)計(jì)

    這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)影院管理系統(tǒng)程序設(shè)計(jì),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • QT進(jìn)行CSV文件初始化與讀寫操作

    QT進(jìn)行CSV文件初始化與讀寫操作

    這篇文章主要為大家詳細(xì)介紹了在QT環(huán)境中如何進(jìn)行CSV文件的初始化、寫入和讀取操作,本文為大家整理了相關(guān)的操作的多種方法,希望對(duì)大家有所幫助
    2025-04-04
  • C語言中的結(jié)構(gòu)體內(nèi)嵌函數(shù)用法

    C語言中的結(jié)構(gòu)體內(nèi)嵌函數(shù)用法

    這篇文章主要介紹了C語言中的結(jié)構(gòu)體內(nèi)嵌函數(shù)用法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • 詳解C語言和Python中的線程混用

    詳解C語言和Python中的線程混用

    這篇文章主要介紹了C和Python中的線程混用的相關(guān)資料,文中講解非常細(xì)致,幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-07-07
  • C++11 GC Interface垃圾回收從入門到精通

    C++11 GC Interface垃圾回收從入門到精通

    本文主要介紹了C++11 GC Interface垃圾回收從入門到精通,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2025-06-06

最新評(píng)論

天镇县| 舟山市| 平定县| 岳普湖县| 彝良县| 朔州市| 如东县| 东阳市| 进贤县| 南昌县| 杭锦后旗| 南涧| 兴文县| 石城县| 南宫市| 玉溪市| 桂平市| 鸡西市| 定襄县| 同德县| 咸丰县| 无锡市| 白银市| 广安市| 临汾市| 樟树市| 江川县| 迁西县| 云霄县| 二手房| 自贡市| 威远县| 安化县| 桐柏县| 佳木斯市| 上思县| 石首市| 纳雍县| 元江| 临湘市| 百色市|