68精品久久久久久欧美,最近中文字幕完整在线看一,久久亚洲男人天堂,最近中文字幕完整视频高清1

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

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

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

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

1棧 - 由編譯器自動分配釋放

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

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

4另外還有一個專門放常量的地方。 - 程序結(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ū),編譯器可能會將它與p3所指向的 "123456 "優(yōu)化成一塊。

}

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

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

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

char s1[] = "aaaaaaaaaaaaaaa ";

char *s2 = "bbbbbbbbbbbbbbbbb ";

aaaaaaaaaaa是在運行時刻符值的,而bbbbbbbbbbb是在編譯時就確定的

但是,在以后的存取中,在棧上的數(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

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

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

棧是先入后出的,一般是由高地址向低地址生長。

編輯:admin  最后修改時間:2018-05-19

聯(lián)系方式

0755-82591179

傳真:0755-82591176

郵箱:vicky@yingtexin.net

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

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

潞城市| 上饶县| 景洪市| 大悟县| 拉孜县| 清远市| 沁源县| 松江区| 神农架林区| 张家港市| 赣州市| 县级市| 辽宁省| 永顺县| 开远市| 玛沁县| 灯塔市| 荔波县| 都江堰市| 乐山市| 江阴市| 将乐县| 钟祥市| 炉霍县| 九龙坡区| 屏东市| 吴忠市| 揭东县| 合川市| 中山市| 淅川县| 茌平县| 佛山市| 金山区| 德钦县| 湘乡市| 孟连| 张家界市| 屏东县| 汪清县| 呈贡县|