googol
驱动牛犊
驱动牛犊
  • 注册日期2001-08-16
  • 最后登录2005-06-06
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1382回复:5

堆和栈

楼主#
更多 发布于:2002-12-14 10:44
平时都是说堆栈,但不知道堆和栈还有区别,那位大虾能给小弟上一课?
Tom_lyd
驱动大牛
驱动大牛
  • 注册日期2001-09-02
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2002-12-14 13:24
堆是Heap, 栈是Stack,两者是截然不同的,平时所予的堆栈,一般指Stack,而非指Heap.

简单地描述一下,Heap是一种公共内存,任何人都可以分配和访问,但是栈却不一定。栈分全局和局部,在一个函数内部声明的非堆内存即是局部栈,其它函数不能访问,且只要退出该函数,该内存块即自动释放。全局栈一般是操作系统使用,用户态程序也不宜访问。
举个例子来予
void textheapstack()
{
   int i=20;
   int iarray[20];
    int intarray[] = new int(i);
   static int j;
}
在这个简单的函数中就体现了上述概念。
i是局部变量,所以有栈中分配,分配多少个字节得视操作系统而定,如果是16位的OS,则分配两个字节,如果是32的机型(NT),则分配4个字节。
iarray也是局部内存,系统在截栈中分配了20个整型变量的空间,且在函数提出时自动释放(通过调节堆栈指针ESP)。
intarray则不是在栈中分配了,而是在堆中分配,且这块内存直到你显式地调用了delete操作符释放其之前,它一直有效。
static类型的变量不在本中分配,虽然它也是在函数内部分配,但是如果再一次执行这个函数,j值为前一退出该函数时的值。这段内存直到程序退出才释放。
Tom_lyd
magicx
驱动老牛
驱动老牛
  • 注册日期2002-02-22
  • 最后登录2014-08-18
  • 粉丝1
  • 关注0
  • 积分-14分
  • 威望13点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2002-12-14 14:33

    int i=20;
    int intarray[] = new int(i);


int i=20;
int *intarray = new int(i);  


 :)
[color=red]大头鬼! :P[/color]
googol
驱动牛犊
驱动牛犊
  • 注册日期2001-08-16
  • 最后登录2005-06-06
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2002-12-14 20:03
谢了先,但还有一点不明:

static类型的变量不在本中分配??????
Ares
驱动小牛
驱动小牛
  • 注册日期2001-03-28
  • 最后登录2020-04-09
  • 粉丝0
  • 关注0
  • 积分20分
  • 威望114点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
  • 社区居民
地下室#
发布于:2002-12-14 23:28
 
static类型的变量不在本中分配

应该是:static类型的变量不在栈中分配
版主用五笔时少打了一个字母
易水
Gong_XG
驱动太牛
驱动太牛
  • 注册日期2002-10-01
  • 最后登录2010-11-25
  • 粉丝0
  • 关注0
  • 积分313分
  • 威望46点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2002-12-15 18:59
不错,学到新东东
游客

返回顶部