話說(shuō)存儲(chǔ)類(lèi)

這是原文的鏈接

存儲(chǔ)類(lèi)(Storage Class)

簡(jiǎn)單來(lái)說(shuō),存儲(chǔ)類(lèi)就是C語(yǔ)言中存儲(chǔ)變量的地方的類(lèi)型
分為動(dòng)態(tài)存儲(chǔ)區(qū),靜態(tài)存儲(chǔ)區(qū)

動(dòng)態(tài)存儲(chǔ)區(qū)

棧(Stack)

  • 其增長(zhǎng)方向:自頂向下增長(zhǎng)
  • 有內(nèi)存空間的限制

存儲(chǔ)內(nèi)容

  1. 函數(shù)形參,在調(diào)用函數(shù)時(shí)給形參分配空間
  2. 函數(shù)內(nèi)的自動(dòng)變量(即普通變量)
  3. 函數(shù)調(diào)用時(shí)的現(xiàn)場(chǎng)保護(hù)和返回地址(即函數(shù)調(diào)用語(yǔ)句的下一句可執(zhí)行語(yǔ)句)
  • 在函數(shù)調(diào)用開(kāi)始時(shí)分配存儲(chǔ)空間,函數(shù)結(jié)束時(shí)釋放存儲(chǔ)空間
  • 函數(shù)調(diào)用結(jié)束時(shí),局部變量先出棧,接著是形參,最后棧指針指向最開(kāi)始存儲(chǔ)的地址來(lái)進(jìn)行下一條指令

堆(Heap)

  • 程序員自定義存儲(chǔ)空間
  • 使用后,需要手動(dòng)釋放內(nèi)存,不然會(huì)造成內(nèi)存泄露

靜態(tài)存儲(chǔ)區(qū)

.data段

  • 存放非零全局變量、靜態(tài)局部變量

.bss段(Block Started by Symbol)

  • 存放未初始化的全局變量、靜態(tài)局部變量
  • 運(yùn)行時(shí),由系統(tǒng)初始化,即清零。一般要自己寫(xiě)

.ROData(文本常量區(qū))

  • 存放字符串常量
char *p="linux";                // 定義了一個(gè)分配在棧上占4字節(jié)的指針指向了一個(gè)分配在文本常量區(qū)上占6字節(jié)的字符串

.text段(代碼區(qū))

  • cup執(zhí)行的機(jī)器指令部分(函數(shù)體的二進(jìn)制代碼)
  • 屬性只讀,為了防止程序由于意外事故而修改自身指令

作用域

作用域即變量或函數(shù)起作用的范圍

  • 文件作用域
  • 代碼作用域

生命周期

  • 永久
  • 臨時(shí)

鏈接屬性

鏈接屬性有以下3種:

  • 外鏈接
  • 內(nèi)鏈接
  • 無(wú)鏈接

宏定義 和 inline內(nèi)聯(lián)函數(shù) 鏈接屬性為 無(wú)鏈接

總結(jié)

類(lèi)型 存儲(chǔ)類(lèi) 作用域 生命周期 鏈接屬性
普通全局變量 .data段/.BSS段 文件作用域 永久 外鏈接
靜態(tài)全局變量 .data段/.BSS段 文件作用域 永久 內(nèi)鏈接
普通局部變量 代碼作用域 臨時(shí) 無(wú)鏈接
靜態(tài)局部變量 .data段/.BSS段 代碼作用域 永久 無(wú)鏈接
普通函數(shù) .text段 文件作用域 永久 外鏈接
靜態(tài)函數(shù) .text段 文件作用域 永久 內(nèi)鏈接

堆與棧的比較


類(lèi)型 Stack Heap
生長(zhǎng)方向 向地址減小的方向增長(zhǎng) 向地址增大的方向增長(zhǎng)
分配方式 動(dòng)態(tài)分配與靜態(tài)分配 動(dòng)態(tài)分配
碎片問(wèn)題 無(wú)此問(wèn)題 過(guò)多使用會(huì)造成內(nèi)存不足
申請(qǐng)后系統(tǒng)響應(yīng) 無(wú)可用空間報(bào)異常提示棧溢出 系統(tǒng)分配申請(qǐng)的內(nèi)存到空閑地址鏈表中
分配效率 相對(duì)高 相對(duì)低
申請(qǐng)大小 系統(tǒng)預(yù)先規(guī)定好大小 系統(tǒng)可用內(nèi)存
申請(qǐng)效率 相對(duì)快 相對(duì)慢,容易產(chǎn)生內(nèi)容碎片
存儲(chǔ)內(nèi)容 看上面 一般在堆的頭部用1字節(jié)存放堆的大小,其他程序員安排
存取效率 相對(duì)快,char s[]="Hello";在運(yùn)行時(shí)賦值;數(shù)組比指針要快一些 相對(duì)慢;char *s="Hello";在編譯時(shí)確定

最后附上一張內(nèi)存分布的圖片

內(nèi)存分布.png

:本文內(nèi)容部分來(lái)自互聯(lián)網(wǎng)整理,部分來(lái)自個(gè)人經(jīng)驗(yàn)總結(jié);本文將持續(xù)收集更新,歡迎留言補(bǔ)充!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容