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中对象时存储在堆中的,系统并不会自动释放堆中的内存(注意基本类型是由系统自己管理的,放在栈上).如果一个对象创建并使用后没 ...
随机推荐
- Tinder 心动效果---卡片式view左右滑动
http://www.eoeandroid.com/thread-549316-1-1.html SlideCard.zip
- RHCA学习笔记:RH442-Unit5 队列原理
NIT 5 Queuing Theory 队列原理 目标: 1.明白性能调优的关键术语 2. 应用队列技术解决性能问题 3.明白性能调优的复杂性 5.1 Introd ...
- Java基础知识强化之IO流笔记50:IO流练习之 复制多级文件夹的案例
1. 复制多级文件夹的案例 需求:复制多级文件夹 数据源:E:\JavaSE\day21\code\demos 目的地:E:\ 分析: A:封装数据源File ...
- Bootstrap与tab组合,切换菜单实例
<html><head><meta http-equiv="Content-Type" content="text/html; charse ...
- C++ notes for beginners(2)
作者:马 岩(Furzoom) (http://www.cnblogs.com/furzoom/)版权声明:本文的版权归作者与博客园共同所有.转载时请在明显地方注明本文的详细链接,未经作者同意请不要删 ...
- [置顶] 读取pdf并且在web页面中显示
读取pdf并且在web页面中显示 if (System.IO.File.Exists(f)) { Response.ContentType = "applicationpdf"; ...
- OpenJDK1.8 安装
1. 安装JDK yum install -y java-1.8.0-openjdk-devel 2. 设置环境变量 /etc/profile文件增加 export JAVA_HOME=/usr/li ...
- 获取当前时间日期并格式化--JS
工作当中,总是遇到很多觉得不错的JS脚本.现在觉得还是找个地方记录下来,以后可以随时查看. /** *获取当前时间日期并格式化 */ function getNowDate(){ var mydate ...
- Java json工具类,jackson工具类,ObjectMapper工具类
Java json工具类,jackson工具类,ObjectMapper工具类 >>>>>>>>>>>>>>> ...
- 검색엔진의 크롤링과 인덱싱의 차이 (robots.txt 파일과 meta robots 태그의 차이점)
검색엔진의 크롤링과 인덱싱의 차이크롤링 제어는 robots.txt인덱싱 제어는 < meta name="robots" content="noindex& ...