1樓:諧波治理無功補償
不是的,棧上分配的記憶體,在函式執行結束時,會自動釋放掉;而在堆上分配的記憶體,需要程式設計師自己負責在何時用free或delete釋放記憶體。
一、記憶體的分配方式:
記憶體分配方式有三種:
1、從靜態儲存區域分配。
記憶體在程式編譯的時候就已經分配好,這塊記憶體在程式的整個執行期間都存在。例如全域性變數,static變數。
2、在棧上建立。
在執行函式時,函式內區域性變數的儲存單元都可以在棧上建立,函式執行結束時這些儲存單元自動被釋放。棧記憶體分配運算內建於處理器的指令集中,效率很高,但是分配的記憶體容量有限。
3、從堆上分配,亦稱動態記憶體分配。
程式在執行的時候用malloc或new申請任意多少的記憶體,程式設計師自己負責在何時用free或delete釋放記憶體。動態記憶體的生存期由程式設計師決定,使用非常靈活,但如果在堆上分配了空間,就有責任**它,否則執行的程式會出現記憶體洩漏,頻繁地分配和釋放不同大小的堆空間將會產生堆內碎塊。
2樓:福喜
記憶體分配方式有三種:
(1)從靜態儲存區域分配。記憶體在程式編譯的時候就已經分配好,這塊記憶體在程式的整個執行期間都存在。例如全域性變數,static變數。
(2)在棧上建立。在執行函式時,函式內區域性變數的儲存單元都可以在棧上建立,函式執行結束時這些儲存單元自動被釋放。棧記憶體分配運算內建於處理器的指令集中,效率很高,但是分配的記憶體容量有限。
(3) 從堆上分配,亦稱動態記憶體分配。程式在執行的時候用malloc或new申請任意多少的記憶體,程式設計師自己負責在何時用free或delete釋放記憶體。動態記憶體的生存期由我們決定,使用非常靈活,但問題也最多。
花括號初始化,資料是分配到堆上還是棧上了
3樓:
c++中的類初始化的時候就有這樣的形式,所以c++乾脆把標準的內建類(即我們把int等也看作是個類)也當作一般類來對待,所以它的物件(即sum,a)的初始化就可以這麼做了。lz看一下essential c++裡就專門講過這個問題。
誰給我解釋下,什麼是在棧上分配記憶體,與在堆上分配記憶體
4樓:匿名使用者
記憶體bai分配方式有三種:
(1)從靜態存du儲區域分配zhi。記憶體在程式dao編譯的時候就已經分配好,版這塊記憶體權在程式的整個執行期間都存在。例如全域性變數,static變數。
(2)在棧上建立。在執行函式時,函式內區域性變數的儲存單元都可以在棧上建立,函式執行結束時這些儲存單元自動被釋放。棧記憶體分配運算內建於處理器的指令集中,效率很高,但是分配的記憶體容量有限。
(3) 從堆上分配,亦稱動態記憶體分配。程式在執行的時候用malloc或new申請任意多少的記憶體,程式設計師自己負責在何時用free或delete釋放記憶體。動態記憶體的生存期由我們決定,使用非常靈活,但問題也最多。
什麼是堆?什麼是棧啊?
5樓:暴走少女
堆(英語:heap)是電腦科學中一類特殊的資料結構的統稱。堆通常是一個可以被看做一棵樹的陣列物件。
棧(stack)又名堆疊,它是一種運算受限的線性表。限定僅在表尾進行插入和刪除操作的線性表。這一端被稱為棧頂,相對地,把另一端稱為棧底。
向一個棧插入新元素又稱作進棧、入棧或壓棧,它是把新元素放到棧頂元素的上面,使之成為新的棧頂元素;從一個棧刪除元素又稱作出棧或退棧,它是把棧頂元素刪除掉,使其相鄰的元素成為新的棧頂元素。
擴充套件資料:
一、堆的演算法思想
不必將值一個個地插入堆中,通過交換形成堆。假設根的左、右子樹都已是堆,並且根的元素名為r。這種情況下,有兩種可能:
(1) r的值小於或等於其兩個子女,此時堆已完成。
(2) r的值大於其某一個或全部兩個子女的值,此時r應與兩個子女中值較小的一個交換,結果得到一個堆,除非r仍然大於其新子女的一個或全部的兩個。這種情況下,我們只需簡單地繼續這種將r「拉下來」的過程,直至到達某一個層使它小於它的子女,或者它成了葉結點。
二、棧的基本演算法
1、進棧(push)演算法
①若top≥n時,則給出溢位資訊,作出錯處理(進棧前首先檢查棧是否已滿,滿則溢位;不滿則作②)。
②置top=top+1(棧指標加1,指向進棧地址)。
③s(top)=x,結束(x為新進棧的元素)。
2、退棧(pop)演算法
①若top≤0,則給出下溢資訊,作出錯處理(退棧前先檢查是否已為空棧, 空則下溢;不空則作②)。
②x=s(top),(退棧後的元素賦給x)。
③top=top-1,結束(棧指標減1,指向棧頂)。
6樓:利漆
什麼是堆和棧?
一個由c/c++編譯的程式佔用的記憶體分為以下幾個部分
1、棧區(stack)— 由編譯器自動分配釋放 ,存放函式的引數值,區域性變數的值等。其操作方式類似於資料結構中的棧。
2、堆區(heap) — 一般由程式設計師分配釋放, 若程式設計師不釋放,程式結束時可能由os** 。注意它與資料結構中的堆是兩回事,分配方式倒是類似於連結串列,呵呵。
3、全域性區(靜態區)(static)—,全域性變數和靜態變數的儲存是放在一塊的,初始化的全域性變數和靜態變數在一塊區域, 未初始化的全域性變數和未初始化的靜態變數在相鄰的另一塊區域。 - 程式結束後有系統釋放
4、文字常量區 —常量字串就是放在這裡的。 程式結束後由系統釋放
5、程式**區—存放函式體的二進位制**。
函式壓棧是怎麼回事?
函式壓棧的本質是引數傳遞
這又跟組合語言連繫起來了.組合語言的過程即proc可以理解成函式
比如一個最簡單的計算兩數之和函式
如果用匯編來寫估計是這樣的
sub proc
pop ax ;從stack取a 並放在ax暫存器中
pop bx ;從stack取b 並放在bx暫存器中
add ax,bx ; 計算a+b
ret //返回
sub endp
顯然要呼叫這個函式,你應當先把b值push進stack,然後再push a
因為stack是先進後出的
所以呼叫匯編像這樣
比如計算4+5
push 5;
push 4;
call sub; //返回值在ax中
在這個例子中先壓5或先壓4得到的結果沒有變化
但大多數程式,如果引數的順序錯誤將是災難性的
因為不管什麼高階語言最終都要編譯成組合語言,然後是機器語言
同樣下面這個c程式,計算a+b值,必然會編譯成上面的彙編**
int sub(int a ,int b)
所以c在呼叫這個函式sub時,必須要壓棧(即傳入引數)但這些工作,在c語言裡,並不需要你來完成.你只要寫出
sub(7,9);
編譯器在編譯成彙編時就會自動完成相關的壓棧工作.
根據函式呼叫方式和引數壓入順序目前存在三種約定:
stdcall
cdecl
fastcall
這都相關壓棧順序和棧的清理工作約定
他們的細節都不相同,但有一點是肯定的,引數比須從右向左壓入棧中
stdcall中 函式必須自已清理棧
cdecall 由呼叫者清除堆疊 c的預設函式呼叫方式 所以這樣c支援可變引數
fastcall 是把函式引數列表的前三個引數放入暫存器eax,edx,ecx,其他引數壓棧
源**:
int function(int a, int b)
void main()
1.__cdecl
_function
push ebp
mov ebp, esp
mov eax, [ebp+8] ;引數1
add eax, [ebp+c] ;加上引數2
pop ebp
retn
_main
push ebp
mov ebp, esp
push 14h ;引數 2入棧
push 0ah ;引數 1入棧
call _function ;呼叫函式
add esp, 8 ;修正棧
xor eax, eax
pop ebp
retn
2.__fastcall
@function@8
push ebp
mov ebp, esp ;儲存棧指標
sub esp, 8 ;多了兩個區域性變數
mov [ebp-8], edx ;儲存引數 2
mov [ebp-4], ecx ;儲存引數 1
mov eax, [ebp-4] ;引數 1
add eax, [ebp-8] ;加上引數 2
mov esp, ebp ;修正棧
pop ebp
retn
_main
push ebp
mov ebp, esp
mov edx, 14h ;引數 2給edx
mov ecx, 0ah ;引數 1給ecx
call @function@8 ;呼叫函式
xor eax, eax
pop ebp
retn
3.__stdcall
_function@8
push ebp
mov ebp, esp
mov eax, [ebp] ;引數 1
add eax, [ebp+c] ;加上引數 2
pop ebp
retn 8 ;修復棧
_main
push ebp
mov ebp, esp
push 14h ;引數 2入棧
push 0ah ;引數 1入棧
call _function@8 ;函式呼叫
xor eax, eax
pop ebp
retn
我不優秀無論是外是內,可是也在努力,為什麼沒人欣賞,失望又失落的心情,得到別人的喜歡歡迎真難
你人再好,也不是每個人都會喜歡你!你人再好 不是每個人都會喜歡你 有人羨慕你,也有人討厭你,有人嫉妒你,也有人看不起你。生活就是這樣,你所做的一切不能讓每個人都滿意,不要為了討好別人而丟失自己的本性,因為每個人都有原則和自尊!別人嘴裡的你,不是真實的你,一樣的眼睛,不一樣的看法。一樣的嘴巴,不一樣的...
不要將希望寄託在別人身上,無論是情感還是工作
對的,什麼都要靠自己,只有內心的強大才能過得好。抱抱你 靠山山會倒靠人人會跑,只有自己最可靠!永遠不要把希望寄託在別人身上,如果讓我選擇我永遠不會選擇現在的生活,也不會再投入感情了,最後弄的自 有精神寄託是好事 如果她能讓你進步 更是好上加好 但如果過於在乎依賴這個寄託 最後傷害的一定是自己 願自己...
建議書的日期是在署名上還是下建議書需不需要寫時間
建議書的日期應該寫在建議人姓名 署名 的下方。下面一例文供你參考 建議書學校領導 每週星期一上午8 00,全校師生都集中到學校大操場舉行升旗儀式。隨著那雄壯的國歌聲,鮮豔的五星紅旗冉冉升起,我們每位少先隊員為能生活在這樣的國度感到無比驕傲和自豪,這是我們接受愛國主義教育的最好時機。然而,少先隊大隊部...