用动物做网站名,做视频网站代码,网站里可以添加视频做背景吗,上海设计公司招聘信息作者#xff1a;阮一峰 学习编程的时候#xff0c;经常会看到stack这个词#xff0c;它的中文名字叫做”栈”。 理解这个概念#xff0c;对于理解程序的运行至关重要。容易混淆的是#xff0c;这个词其实有三种含义#xff0c;适用于不同的场合#xff0c;必须加以区分。… 作者阮一峰 学习编程的时候经常会看到stack这个词它的中文名字叫做”栈”。 理解这个概念对于理解程序的运行至关重要。容易混淆的是这个词其实有三种含义适用于不同的场合必须加以区分。 含义一数据结构 stack的第一种含义是一组数据的存放方式特点为LIFO即后进先出Last in, first out。 在这种数据结构中数据像积木那样一层层堆起来后面加入的数据就放在最上层。使用的时候最上层的数据第一个被用掉这就叫做”后进先出”。 与这种结构配套的是一些特定的方法主要为下面这些。 push在最顶层加入数据。pop返回并移除最顶层的数据。top返回最顶层数据的值但不移除它。isempty返回一个布尔值表示当前stack是否为空栈。 含义二代码运行方式 stack的第二种含义是“调用栈”call stack表示函数或子例程像堆积木一样存放以实现层层调用。 下面以一段Java代码为例来源。
class Student{int age; String name; public Student(int Age, String Name){this.age Age;setName(Name);}public void setName(String Name){this.name Name;}
}public class Main{public static void main(String[] args) {Student s; s new Student(23,Jonh);}
} 上面这段代码运行的时候首先调用main方法里面需要生成一个Student的实例于是又调用Student构造函数。在构造函数中又调用到setName方法。 这三次调用像积木一样堆起来就叫做”调用栈”。程序运行的时候总是先完成最上层的调用然后将它的值返回到下一层调用直至完成整个调用栈返回最后的结果。 含义三内存区域 stack的第三种含义是存放数据的一种内存区域。程序运行的时候需要内存空间存放数据。一般来说系统会划分出两种不同的内存空间一种叫做stack栈另一种叫做heap堆。 它们的主要区别是stack是有结构的每个区块按照一定次序存放可以明确知道每个区块的大小heap是没有结构的数据可以任意存放。因此stack的寻址速度要快于heap。 其他的区别还有一般来说每个线程分配一个stack每个进程分配一个heap也就是说stack是线程独占的heap是线程共用的。此外stack创建的时候大小是确定的数据超过这个大小就发生stack overflow错误而heap的大小是不确定的需要的话可以不断增加。 根据上面这些区别数据存放的规则是只要是局部的、占用空间确定的数据一般都存放在stack里面否则就放在heap里面。请看下面这段代码来源。
public void Method1()
{int i4;int y2;class1 cls1 new class1();
} 上面代码的Method1方法共包含了三个变量i, y 和 cls1。其中i和y的值是整数内存占用空间是确定的而且是局部变量只用在Method1区块之内不会用于区块之外。cls1也是局部变量但是类型为指针变量指向一个对象的实例。指针变量占用的大小是确定的但是对象实例以目前的信息无法确知所占用的内存空间大小。 这三个变量和一个对象实例在内存中的存放方式如下。 从上图可以看到i、y和cls1都存放在stack因为它们占用内存空间都是确定的而且本身也属于局部变量。但是cls1指向的对象实例存放在heap因为它的大小不确定。作为一条规则可以记住所有的对象都存放在heap。 接下来的问题是当Method1方法运行结束会发生什么事 回答是整个stack被清空i、y和cls1这三个变量消失因为它们是局部变量区块一旦运行结束就没必要再存在了。而heap之中的那个对象实例继续存在直到系统的垃圾清理机制garbage collector将这块内存回收。因此一般来说内存泄漏都发生在heap即某些内存空间不再被使用了却因为种种原因没有被系统回收。 完 源自阮一峰个人博客 转载于:https://www.cnblogs.com/wangzhigang/p/4974910.html