<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > [跟我學(xué)嵌入式開(kāi)發(fā)] 堆和棧

[跟我學(xué)嵌入式開(kāi)發(fā)] 堆和棧

作者: 時(shí)間:2016-11-28 來(lái)源:網(wǎng)絡(luò ) 收藏


圖 3
對于堆我們已經(jīng)知道了必須調用相應的API來(lái)分配內存,那從??臻g分配內存也需要調用API嗎?答案是通常不需要,為什么是通常?因為,在有的平臺上(Linux上就是)提供??臻g的分配API,即這種API被調用時(shí),是從調用任務(wù)的??臻g中分配內存的。對于這一功能,在嵌入式系統中使用得非常的少,我也不建議大家使用。對于下面的代碼,mem_main、mem_foo和mem_bar的大小是4K字節(假設int類(lèi)型的大小是4字節),這些內存就是自動(dòng)(注意是自動(dòng))分配在運行任務(wù)的棧上的。我們假設某個(gè)任務(wù)當前所使用的棧是零字節,當這一任務(wù)運行到main中且沒(méi)有進(jìn)入foo ()時(shí),其所占用的空間大小是大約4K字節,之所以用大約這個(gè)詞,是因為函數的調用還有其它的棧開(kāi)銷(xiāo)。一旦任務(wù)運行進(jìn)入foo ()函數但沒(méi)有進(jìn)入bar ()函數,那么所占用的棧的大小就變?yōu)榇蠹s8K字節。同樣的,如果程序運行進(jìn)入bar ()函數,那么所占用的??臻g大約就是12K字節了。
00001:voidbar()
00002:{
00003:intmem_bar[1024];
00004:// application logic
00005:}
00006:
00007:voidfoo()
00008:{
00009:intmem_foo[1024];
00010:bar();
00011:}
00012:
00013:intmain()
00014:{
00015:intmem_main[1024];
00016:foo();
00017:return 0;
00018:}

如果程序繼續運行,從bar ()函數返回到foo ()函數中,那么其所占用的??臻g就從大約12K字節變成了大約8K字節了。相類(lèi)似的是,如果程序從foo ()函數中返回到main ()函數,那么所占用的??臻g又變?yōu)榇蠹s4K字節了。對于嵌入式系統開(kāi)發(fā),由于任務(wù)棧通常都比較的小,那這告訴我們什么呢?我想有以下幾點(diǎn)需要注意。
1)函數的調用深度越是深,由于每一級的函數通常都會(huì )有局部變量,那么所使用的??臻g也會(huì )累積得越大。
2)遞歸調用需要的??臻g會(huì )相對的大(視具體的情況),在嵌入式系統中也建議少用。
3)我們應當盡可能的不要在函數中定義占用內存空間較大的局部變量。

下面,我們總結一下堆與棧的區別,它們是:
1)堆是大家共享的。任務(wù)可以通過(guò)調用API來(lái)從堆中分配內存空間。
2)棧是任務(wù)所獨有的。在嵌入式系統中,當一個(gè)任務(wù)創(chuàng )建起來(lái)后其??臻g的大小往往是定了的。函數中的局部變量是由編程語(yǔ)言自動(dòng)從棧上分配的,我們不需要調用API進(jìn)行空間分配。

最后我有一個(gè)問(wèn)題留給讀者您,這個(gè)問(wèn)題是:
前面的講解中,我們說(shuō)任務(wù)的棧是由操作系統的任務(wù)創(chuàng )建API從堆中分配出來(lái)的,那棧是否也可以位于.data段或是.bss段中呢?為什么?

答案
由于堆從本質(zhì)上說(shuō)來(lái)就是一塊內存,由于在C語(yǔ)言中一塊內存可以從堆中分配,也可以從.data段或是.bss段中分配。因此,任務(wù)的棧也是可以從這三塊內存中分配獲得,也就是說(shuō)最終的答案是:可以。

你或許還想看一看《程序中的段》。

如果你覺(jué)得本文的哪些地方需要改進(jìn)或是存在一些不明白的地方,請留言。如果你想參與討論嵌入式系統開(kāi)發(fā)相關(guān)的話(huà)題,請加入技術(shù)圈(g.51cto.com/UltraEmbedded)。


上一頁(yè) 1 2 下一頁(yè)

關(guān)鍵詞: 嵌入式開(kāi)發(fā)堆和

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>