string内存管理
本人从事.net开发快两年了,一直认为鄙人的C++基础还是很扎实的,并且对Windows操作系统也有一定认识(Linux系就真比较少用),刚毕业的时候,也曾经经常研究游戏破解之类的小外挂,那时候真是折腾得津津有味啊,还记得在学校的时候,还没听过
“wifi破解”之类的互联网思维制造出来的蹭网神器,当时使用的是BT(back/track)和奶瓶两个Linux系的小型操作系统来破解的,当时玩得不亦乐乎,不扯了,入正题:
.net框架的数据类型就分两种:值类型和引用类型。值类型的值就直接保存栈上面,该变量的作用于完了,其所占用的占内存就自动释放了,这没什么好说的。
对于引用类型,其内存分配是在堆上完成的,栈上面也需要空间类保存指向堆上所分配内存的地址,其在栈上面所分配的用来存地址的内存会在其作用域完了之后自动释放,但是堆上为他分配的内存不会自动释放。总的来说,栈上面的内存使用比较频繁,分配和释放效率都很高,但是其宗的大小也比较小,一般用于小量内存的分配,因为系统对线程栈的大小是有限制的,但是对于堆的大小是没限制的。栈和堆的相关知识在后面再写一篇文章。
string也是属于引用类型,由于string类型是我们最常用的类型,微软基于对内存和性能的考虑,对string类型增加了其他应用类型没有的特性;string具有驻留性和恒定性,怎么理解呢?驻留性就是说,string类型的常量(注意是常量)一旦定义了,就会一直驻留在内存里面,不会GC回收,而string变量是不具有驻留性的。那恒定性怎么理解呢,恒定性就是string(注意,并非要求是常量,string变量也是这样)一旦定义了,就不会被改变,对其的一些操作会单独生成多一个字符串,例如:
string str = "abc";
str = str+"d";
string str2 = "abc";
这样,内存里面就会存在abc和abcd两个字符串,第二个把两个字符串连起来的语句不会对原来的字符串做出改变,而是另外开辟多一块内存来存这个。根据string的驻留性,“abc”会一直驻留在内存里面,而abcd不会一直驻留在内存里面,超出了作用域GC就会把"abcd"回收。所以,如果某个字符串需要不断的动态相加的,建议使用StringBuilder。为什么要赋予string这两个特性呢,是因为string的使用频率太高了,这样反而可以节省内存,相同的字符串常量在内存里面只会存在一份,如果有相同的话,则是共享一块内存的。其实.Net中会自动维护一个常量池,里面用于存放静态常量和字符串常量,这个常量池是不受GC管理的,不会释放的,除非进程结束。
注意,在.net中,一个引用对象的创建都要通过new来创建的,除了string,string是通过“”来创建一个对象的,所以在java中string str = new string("dd"),这样是创建了两个对象的。
string通过不同的方式定义,产生的效果也不一样(详细请看:http://www.cnblogs.com/artech/archive/2007/03/04/663728.aspx);
string内存管理的更多相关文章
- iOS: ARC & MRC下string内存管理策略探究
ARC & MRC下string内存管理策略探究 前两天跟同事争论一个关于NSString执行copy操作以后是否会发生变化,两个人整了半天,最后写代码验证了一下,发现原来NSString操作 ...
- string的内存管理问题
string的内存管理是通过仅仅增不减的方式进行的,string的clear方法不会真正的释放内存,假设须要真正的释放内存可以连续调用string的这两个方法.resize(0),reserve(). ...
- C/C++(C++内存管理,内联函数,类型转换,命名空间,string类)
---恢复内容开始--- 内存管理 new/delete C语言中提供了 malloc 和 free 两个系统函数,#include "stdlib.h"库函数,完成对堆内存的申请 ...
- .NET基础拾遗(1)类型语法基础和内存管理基础
Index : (1)类型语法.内存管理和垃圾回收基础 (2)面向对象的实现和异常的处理 (3)字符串.集合与流 (4)委托.事件.反射与特性 (5)多线程开发基础 (6)ADO.NET与数据库开发基 ...
- cocos2d-x内存管理
Cocos2d-x内存管理 老师让我给班上同学讲讲cocos2d-x的内存管理,时间也不多,于是看了看源码,写了个提纲和大概思想 一. 为什么需要内存管理 1. new和delete 2. 堆上申 ...
- Swift中的可选链与内存管理(干货系列)
干货之前:补充一下可选链(optional chain) class A { var p: B? } class B { var p: C? } class C { func cm() -> S ...
- jvm--3.内存管理
5.JVM内存管理 JAVA虚拟机在执行java程序的过程中,会把它管理的内存分成若干个不同的数据区域. ----------------------------------------------- ...
- Object-c 内存管理
内存管理 主要内容 1.内存管理的概念 2.引用计数 3.如何持有对象所有权 4.自动释放池 5.@property的使用 什么是内存管理 内存管理是关于如何管理对象生 ...
- iOS开发系列—Objective-C之内存管理
概述 我们知道在程序运行过程中要创建大量的对象,和其他高级语言类似,在ObjC中对象时存储在堆中的,系统并不会自动释放堆中的内存(注意基本类型是由系统自己管理的,放在栈上).如果一个对象创建并使用后没 ...
随机推荐
- Redis学习手册(String数据类型)
一.概述: 字符串类型是Redis中最为基础的数据存储类型,它在Redis中是二进制安全的,这便意味着该类型可以接受任何格式的数据,如JPEG图像数据或Json对象描述信息等.在Redis中字符串类型 ...
- Java的递归算法
递归算法设计的基本思想是:对于一个复杂的问题,把原问题分解为若干个相对简单类同的子问题,继续下去直到子问题简单到可以直接求解,也就是说到了递推的出口,这样原问题就有递推得解. 关键要抓住的是: (1) ...
- Bash For Loop Examples for Your Linux Shell Scripting--ref
There are two types of bash for loops available. One using the “in” keyword with list of values, ano ...
- 音频播放AVFoundation框架
一.系统声音 ios应用中的提醒声音.游戏背景音乐等.可以播放的格式有CAF.AIF.WAV. 系统声音服务提供了一个API,但是没有操作声音和控制音量的功能,因此如果为多媒体或者游戏创建专门的声音, ...
- nofollow标签如何使用
“nofollow”的意思是不传递权重,向网站站长提供了一种方式,即告诉搜索引擎“不要追踪此网页上的链接”或“不要追踪此特定链接”. nofllow的形式 1.<meta name=" ...
- 20160410javaweb之JDBC---DBUtils框架
DBUtils 1.DbUtils 工具类 2.QueryRunner -- 两行代码搞定增删改查 (1)QueryRunner() --需要控制事务时,使用这组方法 int update(Conne ...
- SetTimer的使用
SetTimer函数用于创建一个计时器,KillTimer函数用于销毁一个计时器.计时器属于系统资源,使用完应及时销毁. SetTimer的函数原型如下:UINT_PTR SetTimer( HWND ...
- 手动修复OneDrive的DNS污染屏蔽的方法
随着云计算的发展和微软云战略的持续推进,使用网盘进行文档存储.协同编辑与共享已成为文档操作的新流程.而Office.Office 365和OneDrive等微软产品是Windows用户的首选.但由于国 ...
- python模块与包
模块是包括python定义和声明的文件.文件名=模块名+".py".模块名保存在全局变量__name__中. 1.模块中的执行语句,只是在导入时执行一次.这些语句通常用于初始化模块 ...
- Python入门 学习笔记 (二)
今天学习了一些简单的语法规则,话不多说,开始了: 二.数据类型 常用数据类型中的整形和浮点型就不多说了. 1.字符串 ...