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中对象时存储在堆中的,系统并不会自动释放堆中的内存(注意基本类型是由系统自己管理的,放在栈上).如果一个对象创建并使用后没 ...
随机推荐
- Numeral.js 是一个用于格式化和数字四则运算的js 库
1.Numeral.js 是一个用于格式化和数字四则运算的js 库. 2.支持多种语言,包含中文在内的17种语言. 在浏览器中引用js文件: <script src="numeral. ...
- careercup-位操作5.1
5.1 写程序使整数N中第i位到第j位的值与整数M中的相同. 题目 给定两个32位的数,N和M,还有两个指示位的数,i和j. 写程序使得N中第i位到第j位的值与M中的相同(即:M变成N的子串且位于N的 ...
- LoC
对于图片.Flash等非文本文件统计文件数量.文件大小: 对于文本文件统计文件数量.文本行数.字符数:
- BeagleBone Black Linux驱动程序开发入门(1): LED驱动程序
这篇文章展示如何在BBB平台上编写LED驱动程序,本文的程序是根据国嵌S3C2440的LED驱动的例子并结合内核中OMAP系列的gpio操作来改的.本文中的程序包括驱动程序模块和用户空间程序.废话不多 ...
- 关于Intent的七大属性
原谅我愚昧,Intent七大属性这个概念我也是昨天才接触到,看了一下,都是一些常用的东西,就是没有总结过,那么今天就来简单总结一下. Intent七大属性是指Intent的ComponentName. ...
- 深入理解计算机系统第二版习题解答CSAPP 2.5
分别写出十六进制数0x87654321在大端法机器和小端法机器上第1个.前2个.前3个字节. A.小端法:21 大端法:87 B.小端法:21 43 大端法:87 65 C.小端法:2 ...
- android 中在CMD中查看sqlite
今天第一次学习Sqlite,在代码中执行了sql,但是不知道在上面地方才能直观的查看sqlite中的数据,下面是查看资料后的找到的查看方法: 通过上述可以从cmd进入数据库查看原文地址:http:// ...
- 20151224jquery学习笔记---cookie插件
hello,祝自己平安夜快乐. Cookie 是网站用来在客户端保存识别用户的一种小文件.一般来用库可以保存用户登录信息.购物数据信息等一系列微小信息.一. 使用 cookie 插件官方网站: htt ...
- 计算Android屏幕解锁组合数
晚饭时和同事聊到安卓屏幕解锁时会有多少种解锁方案,觉得很有趣,吃完饭开始想办法解题,花了大概2个小时解决.思路如下: 使用索引值0-9表示从左到右.从上到下的9个点,行.列号很容易从索引值得到: 使用 ...
- SQL的update from 理解
学习了sql的语句都有快3年,工作上使用都一年半的,最近突然想起update from语句,感觉好像很模糊,虽然语法上使用一直正确,一直都是这样使用,但是就好像不是很明白里面的深处意思. 今天特意测试 ...