国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【C/C++】靜態(tài)內(nèi)存分配與動態(tài)內(nèi)存分配

這篇具有很好參考價值的文章主要介紹了【C/C++】靜態(tài)內(nèi)存分配與動態(tài)內(nèi)存分配。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

【C/C++】 靜態(tài)內(nèi)存分配與動態(tài)內(nèi)存分配

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)存單元)。現(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)分配的原因

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

到了這里,關(guān)于【C/C++】靜態(tài)內(nèi)存分配與動態(tài)內(nèi)存分配的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔相關(guān)法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 內(nèi)存動態(tài)分區(qū)分配算法

    內(nèi)存動態(tài)分區(qū)分配算法

    所謂動態(tài)分區(qū)分配,就是指 內(nèi)存在初始時不會劃分區(qū)域,而是會在進程裝入時,根據(jù)所要裝入的進程大小動態(tài)地對內(nèi)存空間進行劃分,以提高內(nèi)存空間利用率,降低碎片的大小 動態(tài)分區(qū)分配算法有以下四種: 1. 首次適應(yīng)算法(First Fit) 空閑分區(qū)以 地址遞增的次序鏈接 。分

    2024年02月11日
    瀏覽(27)
  • C++ 指針進階:動態(tài)分配內(nèi)存

    malloc 是 stdlib.h 庫中的函數(shù),原型為 void *__cdecl malloc(size_t _Size); : 作用 : malloc 函數(shù)沿空閑鏈表(位于內(nèi)存 堆空間 中)申請一塊滿足需求的內(nèi)存塊,將所需大小的內(nèi)存塊分配給用戶剩下的返回到鏈表上; 并返回指向該內(nèi)存區(qū)的首地址的指針,意該指針的類型為 void * ,因此

    2024年02月05日
    瀏覽(27)
  • 超詳細——動態(tài)內(nèi)存分配+柔性數(shù)組

    超詳細——動態(tài)內(nèi)存分配+柔性數(shù)組

    ??個人主頁:fighting小澤 ??作者簡介:目前正在學(xué)習(xí)C語言和數(shù)據(jù)結(jié)構(gòu) ??博客專欄:C語言學(xué)習(xí) ???歡迎關(guān)注:評論????點贊????留言???? 我們已經(jīng)學(xué)會的內(nèi)存開辟方式有:創(chuàng)建一個變量,創(chuàng)建一個數(shù)組 我們創(chuàng)建一個整形變量就會申請4個字節(jié),創(chuàng)建個數(shù)組就會申請

    2023年04月15日
    瀏覽(27)
  • C++類和動態(tài)內(nèi)存分配

    C++類和動態(tài)內(nèi)存分配

    C++能夠在程序運行時決定內(nèi)存的分配,而不是只在編譯階段,因此,就可以根據(jù)程序的需要,而不是根據(jù)一系列嚴格的存儲類型規(guī)則來使用內(nèi)存,C++使用new和delete運算符來動態(tài)控制內(nèi)存,但是,在類中使用這些運算符會導(dǎo)致許多新的問題,在這種情況下,析構(gòu)函數(shù)就是必不可

    2024年04月16日
    瀏覽(26)
  • 【進階C語言】動態(tài)內(nèi)存分配

    【進階C語言】動態(tài)內(nèi)存分配

    本章大致內(nèi)容介紹: 1.malloc函數(shù)和free函數(shù) 2.calloc函數(shù) 3.realloc函數(shù) 4.常見錯誤案例 5.筆試題詳解 6.柔性數(shù)組 1.malloc函數(shù) (1)函數(shù)原型 函數(shù)參數(shù): 根據(jù)用戶的需求需要開辟多大的字節(jié)空間,為無符號的字節(jié)。 返回值: malloc函數(shù)成功開辟內(nèi)存后,會返回該內(nèi)存的起始地址,可

    2024年02月07日
    瀏覽(18)
  • 數(shù)據(jù)結(jié)構(gòu):動態(tài)內(nèi)存分配+內(nèi)存分區(qū)+宏+結(jié)構(gòu)體

    數(shù)據(jù)結(jié)構(gòu):動態(tài)內(nèi)存分配+內(nèi)存分區(qū)+宏+結(jié)構(gòu)體

    1.定義一個學(xué)生結(jié)構(gòu)體,包含結(jié)構(gòu)體成員:身高,姓名,成績;定義一個結(jié)構(gòu)體數(shù)組有7個成員,要求終端輸入結(jié)構(gòu)體成員的值,根據(jù)學(xué)生成績,進行冒泡排序。 1.申請一個10個int類型的堆區(qū)空間,并實現(xiàn)選擇排序(需要導(dǎo)入頭文件 #include stdlib.h) 2.用##拼接帶參宏的參數(shù) 3.宏函

    2024年02月20日
    瀏覽(28)
  • 詳解C語言—動態(tài)內(nèi)存分配(二)

    詳解C語言—動態(tài)內(nèi)存分配(二)

    目錄 前言: 幾個經(jīng)典的例題題 例一: 例二: 例三: 例四: 例五:? ?C/C++程序的內(nèi)存開辟 柔性數(shù)組 柔性數(shù)組的特點: 柔性數(shù)組的使用:? 柔性數(shù)組的代替: 柔性數(shù)組的優(yōu)勢: 小結(jié): 希望在復(fù)習(xí)完詳解C語言—動態(tài)內(nèi)存分配(一)???????,閱讀此篇文章會進一步提升

    2024年02月08日
    瀏覽(28)
  • 深入挖掘C語言 ----動態(tài)內(nèi)存分配

    深入挖掘C語言 ----動態(tài)內(nèi)存分配

    開篇備忘錄: \\\"自給自足的光, 永遠都不會暗\\\" 正文開始 C語言提供了一個動態(tài)開辟內(nèi)存的函數(shù); 這個函數(shù)向內(nèi)存申請一塊連續(xù)可用的空間, 并返回指向這塊空間的指針. 如果內(nèi)存開辟成功, 則返回一個指向開辟好空間的指針 如果開辟失敗, 則返回一個NULL指針, 因此malloc的返回值一

    2024年04月28日
    瀏覽(33)
  • 【C\C++】內(nèi)存分配 和 動態(tài)內(nèi)存管理方式

    【C\C++】內(nèi)存分配 和 動態(tài)內(nèi)存管理方式

    如上圖所示:在C/C++中,有幾個重要的內(nèi)存區(qū)域,每個區(qū)域都有不同的意義和用途。我們從內(nèi)存分配的角度來分析C++各個內(nèi)存區(qū)域的含義: 棧(Stack) :棧是用于 存儲 局部變量、函數(shù)參數(shù)以及函數(shù)調(diào)用信息 的內(nèi)存區(qū)域 。它的特點是 自動分配和釋放 ,并且遵循 后進先出的原

    2024年02月08日
    瀏覽(33)
  • C語言 malloc動態(tài)內(nèi)存分配函數(shù)

    malloc函數(shù):malloc時動態(tài)內(nèi)存分配函數(shù),用于申請一塊連續(xù)的指定大小的內(nèi)存塊區(qū)域以void*類型返回分配的內(nèi)存區(qū)域地址,就是當數(shù)組創(chuàng)建長度不一定 害怕數(shù)據(jù)存儲不夠或者不能浪費時間 在使用malloc開辟空間時,使用完成一定要釋放空間,如果不釋放會造內(nèi)存泄漏。n在使用ma

    2024年02月07日
    瀏覽(17)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包