4 回答

TA貢獻(xiàn)10條經(jīng)驗(yàn) 獲得超7個(gè)贊
To sum up,新式的"變長(zhǎng)數(shù)組",相對(duì)于malloc所分配出的"動(dòng)態(tài)數(shù)組",它不能解決一些問(wèn)題,包括但不限于:
1. 爆棧。malloc分配是在堆區(qū),堆區(qū)向來(lái)慷慨大方能給多少給多少,可是"變長(zhǎng)數(shù)組"仍然是在棧上分配的,開(kāi)大了還是會(huì)爆棧。
2. 雖說(shuō)"變長(zhǎng)數(shù)組"可以運(yùn)行期指定大小,但是大小一旦指定就不可變。你還是沒(méi)辦法用它實(shí)現(xiàn)vector(或者類(lèi)似的結(jié)構(gòu))。
3. 自己管內(nèi)存。因?yàn)?變長(zhǎng)數(shù)組"仍然是棧上分配的,棧下生,棧下死。
如果反過(guò)來(lái)的話(huà),"動(dòng)態(tài)數(shù)組"只能一定程度上代替"變長(zhǎng)數(shù)組"。
原因之一是另一位答主提到過(guò)的,某些情況下根本就沒(méi)有"堆",也沒(méi)有動(dòng)態(tài)內(nèi)存分配。
另一方面堆分配比較耗時(shí),頻繁申請(qǐng)釋放還可能會(huì)產(chǎn)生內(nèi)存碎片。

TA貢獻(xiàn)1條經(jīng)驗(yàn) 獲得超1個(gè)贊
VLA的目的就是數(shù)組的長(zhǎng)度是由一個(gè)變量指定的,而非常數(shù)。而動(dòng)態(tài)數(shù)組,則是數(shù)組長(zhǎng)度可以隨需求變化(擴(kuò)充)。
VLA目前在MSVC/GCC上的實(shí)現(xiàn)全部都是利用到了alloca() ,在棧上動(dòng)態(tài)申請(qǐng)一塊內(nèi)存(移動(dòng)棧指針),當(dāng)函數(shù)返回時(shí),棧指針回歸外一層函數(shù)時(shí)的狀態(tài),因而alloca() 分配的內(nèi)存得以釋放。
實(shí)際工程中不推薦使用VLA。原因如下:
若數(shù)組長(zhǎng)度很大,有造成爆棧的危險(xiǎn)。OS給進(jìn)程的棧的大小是有限的。
使用alloca()后會(huì)造成部分與棧操作有關(guān)的編譯器優(yōu)化失效。
因此,若數(shù)組長(zhǎng)度有可能很大,請(qǐng)直接在堆上分配避免爆棧。
若數(shù)組長(zhǎng)度有個(gè)確定的上限值,可直接用那個(gè)上限值來(lái)申請(qǐng)??臻g

TA貢獻(xiàn)12條經(jīng)驗(yàn) 獲得超8個(gè)贊
變長(zhǎng)數(shù)組一般是在棧上分配,動(dòng)態(tài)數(shù)組一般是在堆上分配。
變長(zhǎng)數(shù)組在函數(shù)返回之后聲明周期就結(jié)束了,而動(dòng)態(tài)數(shù)組需要手動(dòng)free掉。
變長(zhǎng)數(shù)組使用多了容易棧溢出,而且它在c11里只是可選特性,和標(biāo)準(zhǔn) C++ 也不兼容,所以不建議過(guò)多使用。

TA貢獻(xiàn)7條經(jīng)驗(yàn) 獲得超1個(gè)贊
使用 malloc( ) 等函數(shù)分配而成的「動(dòng)態(tài)數(shù)組」的生命周期可自由控制,也可以中途以 realloc ( ) 改變大小
- 4 回答
- 0 關(guān)注
- 8508 瀏覽
添加回答
舉報(bào)