中文字幕 另类精品,亚洲欧美一区二区蜜桃,日本在线精品视频免费,孩交精品乱子片免费

<sup id="3hn2b"></sup>

    1. <sub id="3hn2b"><ol id="3hn2b"></ol></sub><legend id="3hn2b"></legend>

      1. <xmp id="3hn2b"></xmp>

      2. 新聞中心

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

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

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


        圖 3
        對(duì)于堆我們已經(jīng)知道了必須調(diào)用相應(yīng)的API來(lái)分配內(nèi)存,那從??臻g分配內(nèi)存也需要調(diào)用API嗎?答案是通常不需要,為什么是通常?因?yàn)椋谟械钠脚_(tái)上(Linux上就是)提供??臻g的分配API,即這種API被調(diào)用時(shí),是從調(diào)用任務(wù)的??臻g中分配內(nèi)存的。對(duì)于這一功能,在嵌入式系統(tǒng)中使用得非常的少,我也不建議大家使用。對(duì)于下面的代碼,mem_main、mem_foo和mem_bar的大小是4K字節(jié)(假設(shè)int類(lèi)型的大小是4字節(jié)),這些內(nèi)存就是自動(dòng)(注意是自動(dòng))分配在運(yùn)行任務(wù)的棧上的。我們假設(shè)某個(gè)任務(wù)當(dāng)前所使用的棧是零字節(jié),當(dāng)這一任務(wù)運(yùn)行到main中且沒(méi)有進(jìn)入foo ()時(shí),其所占用的空間大小是大約4K字節(jié),之所以用大約這個(gè)詞,是因?yàn)楹瘮?shù)的調(diào)用還有其它的棧開(kāi)銷(xiāo)。一旦任務(wù)運(yùn)行進(jìn)入foo ()函數(shù)但沒(méi)有進(jìn)入bar ()函數(shù),那么所占用的棧的大小就變?yōu)榇蠹s8K字節(jié)。同樣的,如果程序運(yùn)行進(jìn)入bar ()函數(shù),那么所占用的??臻g大約就是12K字節(jié)了。
        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:}

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

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

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

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

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

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


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

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

        評(píng)論


        相關(guān)推薦

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

        關(guān)閉