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中对象时存储在堆中的,系统并不会自动释放堆中的内存(注意基本类型是由系统自己管理的,放在栈上).如果一个对象创建并使用后没 ...
随机推荐
- jfinal获取当前访问路径和端口号
public void generateSingleLicense() throws Exception { System.out.println(getRequest().getRequestURL ...
- Xcode 4-PBXcp error修复-No such file or directory
Xcode 4-PBXcp error修复-No such file or directory (2013-05-02 15:20:50) 转载▼ 标签: apple iphone ios 移动开发 ...
- Java命令行运行参数说明大全--转
来源:http://xinklabi.iteye.com/blog/837435 Java在运行已编译完成的类时,是通过java虚拟机来装载和执行的,java虚拟机通过操作系统命令JAVA_HOME\ ...
- android开发之shape详解
很多时候,使用shape能够实现的效果,你用一张图片也能够实现,但问题是一张图片无论你怎么压缩,它都不可能比一个xml文件小,因此,为了获得一个高性能的手机App,我们在开发中应该遵循这样一个原则:能 ...
- C#扫盲之:前台线程后台线程
1.线程分类 线程由程序员创建,可是创建的方式不同,总体来说有两种,一种是个人构造,也就是使用thread类new线程对象创建,这一类线程是大部分程序员知道的,也叫专用线程;还有一种是由CLR创建,这 ...
- 通过js实时检测文本框内容
思路 1,在获取文本框焦点后,启动定时器,每隔100毫秒来查看文本内容的改变 2,在文本框失去焦点后,清除定时器 下面是一个简单的例子 <!DOCTYPE html> <html&g ...
- Java 链式编程
这里来做一个Java 链式编程的例子,基本就是每次返回一个对象本身,这样就能够去调用对象的方法和属性. package com.sun; public class Demo05 { /** * @pa ...
- (转)Ilist 和list的区别归纳总结
常见问题: Ilist <> 本身只是一个泛型接口, 既然是接口当然不能实例化,只能用如下方法 IList <Class1> IList11 =new List <Cla ...
- 将vs2012的项目转化成VS2010
vs2012生成的项目,如何在只装有VS2010的电脑上打开, 步骤: 1.打开一个记事本,将你的Vs2012生成的项目解决方案文件(.sln文件)文件拖到记事本中 2.修改前两行 Microsof ...
- Android SDK目录含义介绍
Android SDK目录的具体结构: 1.add-ons:该目录下存放第三方公司为Android平台开发的附加功能系统. 2.build-tools:编译工具.保存着一些通用工具,比如aapt.ai ...