這是原文的鏈接
存儲(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)容
- 函數(shù)形參,在調(diào)用函數(shù)時(shí)給形參分配空間
- 函數(shù)內(nèi)的自動(dòng)變量(即普通變量)
- 函數(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ǔ)充!