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

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

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

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

1.1 - 定義概述

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

1.2 - 分類概述

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

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

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

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

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

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

1.3 - 區(qū)別概述

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

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

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

計算機如何創(chuàng)建一個變量?

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

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

示例

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

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

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

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

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

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

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

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

C++ 代碼

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

C 代碼

ptr = calloc(m, n);

等價于

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

IV - 小結(jié)

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

當在堆上分配內(nèi)存時,我們需要手動刪除內(nèi)存,因為即使分配的內(nèi)存范圍結(jié)束(如棧的情況),內(nèi)存也不會被編譯器自己釋放(取消分配 deallocate)。

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

優(yōu)點

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

缺點

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

4.2 - 動態(tài)分配的優(yōu)缺點

優(yōu)點

  • 動態(tài)分配是在運行時進行的
  • 只要我們需要,我們就可以分配(創(chuàng)建)額外的存儲
  • 只要我們使用結(jié)束了,內(nèi)存就可以被取消分配(free / delete)動態(tài)空間
  • 因此,人們總是可以準確地擁有所需的空間量–不多也不少。
  • 如果需要,內(nèi)存大小可以重新分配 

缺點

  • 由于內(nèi)存是在運行時分配的,因此需要更多的時間。
  • 當完成后,內(nèi)存需要由用戶釋放。這一點很重要,因為它更有可能變成難以發(fā)現(xiàn)的 bug。

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

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

相關(guān)文章

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

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

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

    C++簡單實現(xiàn)Dijkstra算法

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

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

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

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

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

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

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

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

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

    QT進行CSV文件初始化與讀寫操作

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

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

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

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

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

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

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

最新評論

申扎县| 徐闻县| 威信县| 漠河县| 武安市| 额尔古纳市| 兴国县| 高碑店市| 茂名市| 梁山县| 琼中| 松江区| 沐川县| 德格县| 龙门县| 赤水市| 新乐市| 黎城县| 鹤山市| 滨州市| 广州市| 江山市| 武汉市| 承德县| 晋州市| 分宜县| 平利县| 哈巴河县| 南京市| 浑源县| 兴城市| 广河县| 海门市| 澎湖县| 中方县| 苏州市| 察雅县| 雅安市| 尉犁县| 沙河市| 正宁县|