堆和栈的区别,堆和堆栈的区别( 二 )


堆是由new分配的内存,一般速度比较慢,而且容易产生内存碎片,不过用起来最方便.
另外,在WINDOWS下,最好的方式是用VirtualAlloc分配内存,他不是在堆,也不是在栈是直接在进程的地址空间中保留一快内存,虽然用起来最不方便 。但是速度快,也最灵活
2.5堆和栈中的存储内容
栈: 在函数调用时 , 第一个进栈的是主函数中后的下一条指令(函数调用语句的下一条可执行语句)的地址,然后是函数的各个参数,在大多数的C编译器中,参数是由右往左入栈的,然后是函数中的局部变量 。注意静态变量是不入栈的 。
当本次函数调用结束后,局部变量先出栈,然后是参数,最后栈顶指针指向最开始存的地址,也就是主函数中的下一条指令,程序由该点继续运行 。
堆:一般是在堆的头部用一个字节存放堆的大小 。堆中的具体内容有程序员安排 。
2.6存取效率的比较
char s1[] = "aaaaaaaaaaaaaaa";
char *s2 = "bbbbbbbbbbbbbbbbb";
aaaaaaaaaaa是在运行时刻赋值的;
而bbbbbbbbbbb是在编译时就确定的;
但是,在以后的存取中,在栈上的数组比指针所指向的字符串(例如堆)快 。
比如:
#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中 , 在根据edx读取字符,显然慢了 。
?
2.7小结:
堆和栈的区别可以用如下的比喻来看出:
使用栈就象我们去饭馆里吃饭,只管点菜(发出申请)、付钱、和吃(使用),吃饱了就走,不必理会切菜、洗菜等准备工作和洗碗、刷锅等扫尾工作,他的好处是快捷,但是自由度小 。
使用堆就象是自己动手做喜欢吃的菜肴,比较麻烦,但是比较符合自己的口味,而且自由度大 。
堆和栈的区别主要分:
操作系统方面的堆和栈,如上面说的那些,不多说了 。
还有就是数据结构方面的堆和栈,这些都是不同的概念 。这里的堆实际上指的就是(满足堆性质的)优先队列的一种数据结构,第1个元素有最高的优先权;栈实际上就是满足先进后出的性质的数学或数据结构 。
虽然堆栈,堆栈的说法是连起来叫,但是他们还是有很大区别的,连着叫只是由于历史的原因 。
是数据结构的知识
堆通常用来排序即“堆排序”
堆排序是指利用堆(heaps)这种数据结构来构造的一种排序算法 。堆是一个近似完全二叉树结构,并同时满足堆属性:即父节点的键值或索引总是大于(大头堆)或者小于(小头堆)任何一个子节点 。通常升序建大头堆降序建小头堆,一般用数组表示 。具体算法可参阅相关数据结构的书籍 。
堆栈也是一种数据结构
线形表是具有n个元素的有限序列,而堆栈是限定仅在表尾进行插入或删除操作的线形表,因此,对堆栈来说表尾称为栈顶,相应的表头称为栈底 , 由于只能在表尾进行插入或删除操作,所以堆栈遵循先进后出的原则即先进入堆栈的元素要在后进去的元素出栈之后才能出栈
堆栈可以用数组表示也可以用链表来表示(链栈) , 两种表示方法各有优劣,要是用途而定 。

经验总结扩展阅读