关于C#中的内存理解
来源:互联网 发布:gcr.io 阿里云 编辑:程序博客网 时间:2024/06/08 05:35
关于C#中的内存理解
内存分为以下几个部分
1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。
2、堆区(heap) — 一般由程序员分配释放 , 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表。
3、全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域(BSS)。 - 程序结束后由系统释放
4、文字常量区 — 常量字符串就是放在这里的。 程序结束后由系统释放
5、程序代码区— 存放函数体的二进制代码。
堆和栈的区别:
1.管理方式:对于栈来讲,是由编译器自动管理,无需我们手工控制;对于堆来说,释放工作由程序员控制,容易产生memory leak。
2.空间大小:一般来讲在32位系统下,堆内存可以达到4G的空间,从这个角度来看堆内存几乎是没有什么限制的。但是对于栈来讲,一般都是有一定的空间大小的,例如,在VC6下面,默认的栈空间大小是1M(好像是,记不清楚了)。当然,我们可以修改:
3.打开工程,依次操作菜单如下:Project->Setting->Link,在Category 中选中Output,然后在Reserve中设定堆栈的最大值和commit。
4.碎片问题:对于堆来讲,频繁的new/delete势必会造成内存空间的不连续,从而造成大量的碎片,使程序效率降低。对于栈来讲,则不会存在这个问题,因为栈是先进后出的队列,他们是如此的一一对应,以至于永远都不可能有一个内存块从栈中间弹出,在他弹出之前,在他上面的后进的栈内容已经被弹出,详细的可以参考数据结构,这里我们就不再一一讨论了。
5.生长方向:对于堆来讲,生长方向是向上的,也就是向着内存地址增加的方向;对于栈来讲,它的生长方向是向下的,是向着内存地址减小的方向增长。
6.分配方式:堆都是动态分配的,没有静态分配的堆。栈有2种分配方式:静态分配和动态分配。静态分配是编译器完成的,比如局部变量的分配。动态分配由alloca函数进行分配,但是栈的动态分配和堆是不同的,他的动态分配是由编译器进行释放,无需我们手工实现。
- 关于C#中的内存理解
- 关于c#中的一些感念的理解。
- 关于C#中的Attribute的简单理解
- 关于C#中对象内存状态的理解
- 关于内存管理,理解
- 关于内存的理解
- 关于内存的理解
- 关于理解内存管理
- C#中的概念理解
- C#中的内存对齐
- C#中的内存分配
- C#中的内存分配
- 关于JAVA中的内存
- 关于内存对齐的理解
- 关于内存的一些理解
- 关于内存的一些理解
- 关于java内存的理解
- 关于内存对齐的理解
- hdu 1576 A/B 求逆元模板题
- Android应用开发-学生信息管理系统
- C++中#define中的#与##作用和区别
- 测试sklearn包中常用的机器学习算法
- 本地eclipse连接外网Hadoop
- 关于C#中的内存理解
- SQL 常用语法一
- PHP学习笔记——each()函数的特性
- 使用RMS API 自定义Office(Word、Excel、PPT)加密策略
- json字符串转换成json数组并遍历属性值
- CSS文本属性
- 2736 FunctionTemplate(eden)
- |poj 1226|后缀数组|二分|Substrings
- 基于FPGA的VGA简易显存设计&NIOS ii软核接入