理解堆与栈
前言
虽然在.Net Framework 中我们不必考虑内在管理和垃圾回收(GC),但是为了优化应用程序性能我们始终需要了解内存管理和垃圾回收(GC)。另外,了解内存管理可以帮助我们理解在每一个程序中定义的每一个变量是怎样工作的。
简介
这篇文章会包含堆与栈的基础知识,变量类型,变量工作原理。
在程序运行时,.NET FRAMEWORK把对象存储在内存中的两个位置:堆与栈,并且它们都会帮助我们更好的运行程序。堆与栈寄存在电脑的操作内存中,并包含我们需要的信息使整个程序运行正常。
堆与栈:有什么不同?
栈,或多或少负责跟踪正在程序中运行的代码。
堆,或多或少负责跟踪程序对象或数据。
栈,把它想像成叠在一起的盒子(像搭积木一样)。每一次调用一个方法就会在最上面叠一个盒子,用来跟踪程序运行情况。我们只能使用栈中叠在最上面的盒子里的东西。当某一最上面的盒子里的代码执行完毕(如方法执行完成),就把它扔掉并继续去使用下一个盒子。
堆,与栈类似,只是它是用来保存信息而不是跟踪执行。所以,堆里的任何信息都可以在任何时间被访问。有了堆,访问信息没有约束,而不像栈只能访问最上面的盒子。
堆的情况就像你把一堆刚洗完的衣服放在床上还没有时间来的及收走,你可以迅速拿到你想要拿的衣服。栈的情况就像你叠在一起的鞋盒子,你需要拿走最上面的盒子才能拿到下一个盒子。
上图并不上真正的内存运行情况,只是为了让大家区分堆和栈。
栈,会自我管理,它有自己的内存管理机制。当最上面的盒子不再使用时,会自动被扔掉。
椎,相反,我们要控制它的垃圾回收(GC)。我们要去管理堆是否干净,就像管理床上的脏衣服。你不手动扔掉它,就会在床上变臭。
什么在堆和栈里
当程序执行时,我们主要有4种类型的东西放进堆和栈里:值类型,引用类型,指针,指令。
值类型:
- bool
- byte
- char
- decimal
- double
- enum
- float
- int
- long
- sbyte
- short
- struct
- uint
- ulong
- ushort
它们都衍生于System.ValueType。
引用类型:
- class
- interface
- delegate
- object
- string
它们都衍生于System.Object。当然object就是System.Object。
指针:
第三种被放于内存管理体制中的是类型的引用。这个引用通常被叫作指针。我们并不具体的使用指针,它们由CLR管理。一个指针(引用)是不同于引用类型的。我们定义它是一个引用类型,意味着我们可以通过指针访问它。一个指针占有一小块内存,这块内存指向另一块内存。指针占用在内存中的存储和其它的相同,只是存放的值既不是内存地址也不是空null。
指令:
我们会在后面的文章中介绍指令怎么工作。
总结
第一节到此结束,以后的章节里会介绍不同对象在堆和栈里存放的不同。
分享到:
相关推荐
1、栈区(stack)—由编译器自动分配释放,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。2、堆区(heap)—一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收。注意它与数据...
非常经典的资料,准确描述了C语言中,堆和栈之间的区别!是深入理解C语言的好材料
java中堆(heap)和堆栈(stack)有什么区别
一、预备知识—程序的内存分配 二、例子程序 3.windows进程中的内存结构
1,堆和栈存储; 2,堆和栈用法; 3,堆和栈管理; 4,堆和栈区别;
heap与stack 的区别, 讲解的很详细了 小细节需要把握仔细了
理解堆与栈对于理解.NET中的内存管理、垃圾回收、错误和异常、调试与日志有很大的帮助。垃圾回收的机制使程序员从复杂的内存管理中解脱出来,虽然绝大多数的C#程序并不需要程序员手动管理内存,但这并不代表程序员就...
heap and stack 深入讲解heap and stack 深入讲解heap and stack 深入讲解heap and stack 深入讲解heap and stack 深入讲解heap and stack 深入讲解
我刚用C#写的堆排序算法(HEAPSORT),算法简洁,质量不错,只是注释不多
《深入浅出MFC》2/e 简体版 目录 第0章 你一定要知道(导读) 这本书适合谁 你需要什么技术基础 你需要什么软硬件环境 让我们使用同一种语言 本书符号习惯 本书例程的取得 范例程序说明 与前版本之差异 如何联络作者...
堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回 收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。 3、全局区(静态区)(static)—,全局变量和静态变量的...
C#,排列组合的堆生成法(Heap’s Algorithm for generating permutations)算法与源代码 排列组合的堆生成法 堆生成算法用于生成n个对象的所有组合。其思想是通过选择一对要交换的元素,在不干扰其他n-2元素的情况...
C/C++语言 stack和heap代码 .c文件 适用于linux ubuntu unix等平台 terminal中操作
本篇文章主要介绍了什么是栈(Stack) 、什么是堆( Heap),以及栈和堆的优缺点,同时介绍了应该什么时候使用堆和栈,有需要的朋友可以参考下
栈(stack)与堆(heap)都是Java用来在Ram中存放数据的地方。与C++不同,Java自动管理栈和堆,程序员不能直接地设置栈或堆。
深入浅出MFC(第二版) 目录 第0章 你一定要知道(导读) 这本书适合谁 你需要什么技术基础 你需要什么软硬件环境 让我们使用同一种语言 本书符号习惯 本书例程的取得 范例程序说明 与前版本之差异 如何联络作者 第...
一个介绍操作系统的堆和栈的入门文档,有图示:)
1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈 2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与...