日本高清不卡中文字幕-一起草草视频在线观看-亚洲精品一区二区三区色-国产亚洲精品免费视频

你好!歡迎來到深圳市穎特新科技有限公司!
語言
當(dāng)前位置:首頁 >> 技術(shù)中心 >> 單片機(jī)入門 >> 堆與棧結(jié)合代碼和匯編解釋

堆與棧結(jié)合代碼和匯編解釋

關(guān)鍵字:C語言 堆棧 作者:admin 來源:不詳 發(fā)布時(shí)間:2018-05-19  瀏覽:17

 一般認(rèn)為在c中分為這幾個(gè)存儲(chǔ)區(qū)

1棧 - 由編譯器自動(dòng)分配釋放

2堆 - 一般由程序員分配釋放,若程序員不釋放,程序結(jié)束時(shí)可能由OS回收

3全局區(qū)(靜態(tài)區(qū)),全局變量和靜態(tài)變量的存儲(chǔ)是放在一塊的,初始化的全局變量和靜態(tài)變量在一塊區(qū)域,未初始化的全局變量和未初始化的靜態(tài)變量在相鄰的另一塊區(qū)域。 - 程序結(jié)束釋放

4另外還有一個(gè)專門放常量的地方。 - 程序結(jié)束釋放

在函數(shù)體中定義的變量通常是在棧上,用malloc, calloc, realloc等分配內(nèi)存的函數(shù)分配得到的就是在堆上。在所有函數(shù)體外定義的是全局量,加了static修飾符后不管在哪里都存放在全局區(qū)(靜態(tài)區(qū)),在所有函數(shù)體外定義的static變量表示在該文件中有效,不能extern到別的文件用,在函數(shù)體內(nèi)定義的static表示只在該函數(shù)體內(nèi)有效。另外,函數(shù)中的 "adgfdf "這樣的字符串存放在常量區(qū)。

比如:

int a = 0; 全局初始化區(qū)

char *p1; 全局未初始化區(qū)

main()

{

int b; 棧

char s[] = "abc ";棧

char *p2; 棧

char *p3 = "123456 "; 123456\0在常量區(qū),p3在棧上。

static int c =0; 全局(靜態(tài))初始化區(qū)

p1 = (char *)malloc(10);

p2 = (char *)malloc(20);

分配得來得10和20字節(jié)的區(qū)域就在堆區(qū)。

strcpy(p1, "123456 "); 123456\0放在常量區(qū),編譯器可能會(huì)將它與p3所指向的 "123456 "優(yōu)化成一塊。

}

還有就是函數(shù)調(diào)用時(shí)會(huì)在棧上有一系列的保留現(xiàn)場(chǎng)及傳遞參數(shù)的操作。

棧的空間大小有限定,vc的缺省是2M。棧不夠用的情況一般是程序中分配了大量數(shù)組和遞歸函數(shù)層次太深。有一點(diǎn)必須知道,當(dāng)一個(gè)函數(shù)調(diào)用完返回后它會(huì)釋放該函數(shù)中所有的?臻g。棧是由編譯器自動(dòng)管理的,不用你操心。

堆是動(dòng)態(tài)分配內(nèi)存的,并且你可以分配使用很大的內(nèi)存。但是用不好會(huì)產(chǎn)生內(nèi)存泄漏。并且頻繁地malloc和free會(huì)產(chǎn)生內(nèi)存碎片(有點(diǎn)類似磁盤碎片),因?yàn)閏分配動(dòng)態(tài)內(nèi)存時(shí)是尋找匹配的內(nèi)存的。而用棧則不會(huì)產(chǎn)生碎片。

char s1[] = "aaaaaaaaaaaaaaa ";

char *s2 = "bbbbbbbbbbbbbbbbb ";

aaaaaaaaaaa是在運(yùn)行時(shí)刻符值的,而bbbbbbbbbbb是在編譯時(shí)就確定的

但是,在以后的存取中,在棧上的數(shù)組比指針?biāo)赶虻淖址?例如堆)快。

比如:

#include

void main()

{

char a = 1;

char c[] = "1234567890 ";

char *p = "1234567890 ";

a = c[1];

a = p[1];

return;

}

10: a = c[1];

00401067 8A 4D F1 mov cl,byte ptr [ebp-0Fh]

0040106A 88 4D FC mov byte ptr [ebp-4],cl

11: a = p[1];

0040106D 8B 55 EC mov edx,dword ptr [ebp-14h]

00401070 8A 42 01 mov al,byte ptr [edx+1]

00401073 88 45 FC mov byte ptr [ebp-4],al

第一種在讀取時(shí)直接就把字符串中的元素讀到寄存器cl中,而第二種則要先把指針值讀到edx中,在根據(jù)edx讀取字符,顯然慢了。

一般大家說的堆棧和棧是一樣的,就是棧(stack),而說堆時(shí)才是堆heap.

棧是先入后出的,一般是由高地址向低地址生長(zhǎng)。

編輯:admin  最后修改時(shí)間:2018-05-19

聯(lián)系方式

0755-82591179

傳真:0755-82591176

郵箱:vicky@yingtexin.net

地址:深圳市龍華區(qū)民治街道民治大道973萬眾潤(rùn)豐創(chuàng)業(yè)園A棟2樓A08

Copyright © 2014-2023 穎特新科技有限公司 All Rights Reserved.  粵ICP備14043402號(hào)-4

苍南县| 城步| 建宁县| 深泽县| 阜城县| 凉山| 兰考县| 青浦区| 云阳县| 南安市| 渝北区| 屯门区| 龙岩市| 阳谷县| 黔西县| 峨边| 阿拉善左旗| 乐至县| 苏州市| 蓬莱市| 大丰市| 康平县| 迁安市| 灌阳县| 临泉县| 荔波县| 沁阳市| 称多县| 淮阳县| 托克逊县| 山阳县| 南丰县| 北碚区| 澎湖县| 凤阳县| 桂东县| 商南县| 兰坪| 靖宇县| 张家界市| 宕昌县|