« | August 2025 | » | 日 | 一 | 二 | 三 | 四 | 五 | 六 | | | | | | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | | | | | | | |
|
公告 |
本站技术贴除标明为“原创”的之外,其余均为网上转载,文中我会尽量保留原作者姓名,若有侵权请与我联系,我将第一时间做出修改。谢谢!
——既瑜 |
统计 |
blog名称:★既瑜★ 日志总数:183 评论数量:636 留言数量:-25 访问次数:1406353 建立时间:2005年3月12日 |
OICQ:215768265
njucs2001@hotmail.com
erichoo1982@gmail.com |
|
W3CHINA Blog首页 管理页面 写新日志 退出
[【技术文档】]堆和栈有什么不同,它们的定义是怎样的? |
by chigher ////////////////////////////////////////////////////////////////////////////// // //Author: Lei Zhengdeng //E-mail: leizhengdeng@163.net //HomePage: http://arden.3322.net //Date: Mar 01, 2002 ////////////////////////////////////////////////////////////////////////////// // 一般认为在c中分为这几个存储区 1栈 - 由编译器自动分配释放 2堆 - 一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收 3全局区(静态区),全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态 变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 - 程 序结束释放 4另外还有一个专门放常量的地方。 - 程序结束释放 在函数体中定义的变量通常是在栈上,用malloc, calloc, realloc等分配内存的函数分配 得到的就是在堆上。在所有函数体外定义的是全局量,加了static修饰符后不管在哪里都 存放在全局区(静态区),在所有函数体外定义的static变量表示在该文件中有效,不能e xtern到别的文件用,在函数体内定义的static表示只在该函数体内有效。另外,函数中的 "adgfdf"这样的字符串存放在常量区。 比如: int a = 0; 全局初始化区 char *p1; 全局未初始化区 main() { int b; 栈 char s[] = "abc";栈 char *p2; 栈 char *p3 = "123456"; 123456\0在常量区,p3在栈上。 static int c =0; 全局(静态)初始化区 p1 = (char *)malloc(10); p2 = (char *)malloc(20); 分配得来得10和20字节的区域就在堆区。 strcpy(p1, "123456"); 123456\0放在常量区,编译器可能会将它与p3所指向的"123456 "优化成一块。 } 还有就是函数调用时会在栈上有一系列的保留现场及传递参数的操作。 栈的空间大小有限定,vc的缺省是2M。栈不够用的情况一般是程序中分配了大量数组和递 归函数层次太深。有一点必须知道,当一个函数调用完返回后它会释放该函数中所有的栈 空间。栈是由编译器自动管理的,不用你操心。 堆是动态分配内存的,并且你可以分配使用很大的内存。但是用不好会产生内存泄漏。并 且频繁地malloc和free会产生内存碎片(有点类似磁盘碎片),因为c分配动态内存时是寻 找匹配的内存的。而用栈则不会产生碎片。 char s1[] = "aaaaaaaaaaaaaaa"; char *s2 = "bbbbbbbbbbbbbbbbb"; aaaaaaaaaaa是在运行时刻符值的,而bbbbbbbbbbb是在编译时就确定的 但是,在以后的存取中,在栈上的数组比指针所指向的字符串(例如堆)快。 比如: #include <stdio.h> 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中,在根据edx读取字符,显然慢了。 一般大家说的堆栈和栈是一样的,就是栈(stack),而说堆时才是堆heap. 栈是先入后出的,一般是由高地址向低地址生长。
|
阅读全文(1458) | 回复(0) | 编辑 | 精华 |
|