• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            旅途

            如果想飛得高,就該把地平線忘掉

            C++堆、棧、自由存儲區(qū)、全局/靜態(tài)存儲區(qū)和常量存儲區(qū)

            在C++中,內(nèi)存分成5個區(qū),他們分別是堆、棧、自由存儲區(qū)、全局/靜態(tài)存儲區(qū)和常量存儲區(qū)。
            ??? 棧,就是那些由編譯器在需要的時候分配,在不需要的時候自動清楚的變量的存儲區(qū)。里面的變量通常是局部變量、函數(shù)參數(shù)等。
            ??? 堆,就是那些由new分配的內(nèi)存塊,他們的釋放編譯器不去管,由我們的應(yīng)用程序去控制,一般一個new就要對應(yīng)一個delete。如果程序員沒有釋放掉,那么在程序結(jié)束后,操作系統(tǒng)會自動回收。
            ??? 自由存儲區(qū),就是那些由malloc等分配的內(nèi)存塊,他和堆是十分相似的,不過它是用free來結(jié)束自己的生命的。
            ??? 全局/靜態(tài)存儲區(qū),全局變量和靜態(tài)變量被分配到同一塊內(nèi)存中,在以前的C語言中,全局變量又分為初始化的和未初始化的,在C++里面沒有這個區(qū)分了,他們共同占用同一塊內(nèi)存區(qū)。
            ??? 常量存儲區(qū),這是一塊比較特殊的存儲區(qū),他們里面存放的是常量,不允許修改(當(dāng)然,你要通過非正當(dāng)手段也可以修改,而且方法很多)
            明確區(qū)分堆與棧
            ??? 在bbs上,堆與棧的區(qū)分問題,似乎是一個永恒的話題,由此可見,初學(xué)者對此往往是混淆不清的,所以我決定拿他第一個開刀。
            ??? 首先,我們舉一個例子:
            ??? void f() { int* p=new int[5]; }
            ??? 這條短短的一句話就包含了堆與棧,看到new,我們首先就應(yīng)該想到,我們分配了一塊堆內(nèi)存,那么指針p呢?他分配的是一塊棧內(nèi)存,所以這句話的意思就是: 在棧內(nèi)存中存放了一個指向一塊堆內(nèi)存的指針p。在程序會先確定在堆中分配內(nèi)存的大小,然后調(diào)用operator new分配內(nèi)存,然后返回這塊內(nèi)存的首地址,放入棧中,他在VC6下的匯編代碼如下:
            ??? 00401028?? push??????? 14h
            ??? 0040102A?? call??????? operator new (00401060)
            ??? 0040102F?? add???????? esp,4
            ??? 00401032?? mov???????? dword ptr [ebp-8],eax
            ??? 00401035?? mov???????? eax,dword ptr [ebp-8]
            ??? 00401038?? mov???????? dword ptr [ebp-4],eax
            ??? 這里,我們?yōu)榱撕唵尾]有釋放內(nèi)存,那么該怎么去釋放呢?是delete p么?澳,錯了,應(yīng)該是delete []p,這是為了告訴編譯器:我刪除的是一個數(shù)組,VC6就會根據(jù)相應(yīng)的Cookie信息去進(jìn)行釋放內(nèi)存的工作。
            ??? 好了,我們回到我們的主題:堆和棧究竟有什么區(qū)別?
            ??? 主要的區(qū)別由以下幾點(diǎn):
            ??? 1、管理方式不同;
            ??? 2、空間大小不同;
            ??? 3、能否產(chǎn)生碎片不同;
            ??? 4、生長方向不同;
            ??? 5、分配方式不同;
            ??? 6、分配效率不同;
            ??? 管理方式:對于棧來講,是由編譯器自動管理,無需我們手工控制;對于堆來說,釋放工作由程序員控制,容易產(chǎn)生memory leak。

            posted on 2007-09-06 01:59 旅途 閱讀(297) 評論(0)  編輯 收藏 引用 所屬分類: C/C++

            久久亚洲精品无码播放| 亚洲中文字幕无码久久精品1| 浪潮AV色综合久久天堂| 久久天天躁狠狠躁夜夜avapp | 亚洲中文字幕无码一久久区| 一本色综合网久久| 久久久中文字幕| 久久久亚洲AV波多野结衣| 丁香狠狠色婷婷久久综合| 欧美久久亚洲精品| 色欲综合久久中文字幕网| 精品一久久香蕉国产线看播放| 97香蕉久久夜色精品国产| 久久久久久国产精品无码超碰| 久久AⅤ人妻少妇嫩草影院| 无码人妻久久一区二区三区免费丨| 99精品久久久久久久婷婷| 精品久久久久久中文字幕大豆网| 91精品国产9l久久久久| 久久久久波多野结衣高潮| 久久国产乱子伦精品免费午夜| 99热成人精品热久久669| 久久婷婷午色综合夜啪| 久久久精品人妻无码专区不卡 | 亚洲级αV无码毛片久久精品| 国产精品一区二区久久精品无码| 久久久久久亚洲Av无码精品专口| 日韩精品无码久久一区二区三 | 人人妻久久人人澡人人爽人人精品| 欧美伊香蕉久久综合类网站| 亚洲AV无码1区2区久久| 一本大道久久东京热无码AV | 国产精品久久久久久久| 久久婷婷五月综合97色直播| 久久影视综合亚洲| 久久国产香蕉一区精品| 精品久久久久久无码中文野结衣 | 国产精品久久久久久搜索| 色88久久久久高潮综合影院| 久久夜色精品国产噜噜噜亚洲AV| 久久精品中文字幕一区|