string知多少

本文介绍了C#中字符串的存储方式,详细解释了字符串池和字符串驻留池的概念及其工作原理。通过实例展示了字符串驻留如何提高内存利用率。
原帖地址:http://www.cnblogs.com/dyhouse/archive/2013/05/29/3107243.html

  C#中string关键字相信大家都不陌生,很熟悉。今天主要讲的内容呢,就是围绕着这个简单的关键字。

  string在C#中是用来定义字符串变量的关键字,很普通,普通得大家可以忽视她,如果你忽视了她,那么你已经失去了一段美好的回忆。下面我们就来追溯这段回忆吧。

首先介绍两个概念:1、字符串池,2、字符串驻留池

1、 字符串池是编译器为执行过程中程序映像和内存中的相同字符串创建单个副本,从而得到较小的程序。

2、 字符串驻留池是CLR初始化时创建一个内部哈希表,表的key是字符串,value是托管堆中String的引用,该表就是驻留池。因为字符串是不变量,如果内存中存在多个相同字符串的实例,便会造成内存的浪费,故高级语言(C#、Java)等都用了字符串驻留池来提高内存利用率。

在这里首先介绍这两个概念的用意是为了告诉大家字符串池和字符串驻留池是不同的概念,不可混淆。

字符串在.Net世界里是如何存储的呢?

我们先看如下流程图:

1、

说明:我们以上操作创建了一个”Aaron”不变量字符串,然后经C#编译器字符串池机制优化了程序集(这里也可以设置编译器禁用字符串池机制,我们针对一般情况,特殊情况忽略),当程序集加载到应用程序域时,CLR2.0版本以上默认会驻留程序集中不变量字符串。

2、

说明:eng_Name并没有创建新的字符串,eng_Name和name引用了托管堆中同一个不变量字符串。

3、

说明:name,eng_Name,full_Name引用了0x~位置的字符串实例,而my_Name则引用了0x$位置的字符串实例。因为full_Name由两个不变量字符串串联起来的,编译器直接认为是”AaronPan”,而my_Name由两个变量串联起来,我们查看IL可以发现两个变量通过Contact()创建了一个新的字符串。

4、

说明:这里采用String类Intern方法访问字符串驻留池。因为驻留池中已经存在一个完全相同的字符串,所以返回匹配字符串的引用,而0x$位置的实例则等待GC回收。

注:

1、 字符串驻留池引用的字符串不会被垃圾回收器回收,其生命周期会伴随着应用程序进程终止而终止。

2、 字符串驻留池虽然可以提高内存利用率,但他要额外维护一个内部哈希表,性能必定会下降,我们可以在C#编译器设置不开启字符串驻留功能。根据实际场景,合理应用。

 

——Aaron.Pan

 

本文链接

内容概要:本文介绍了基于贝叶斯优化的CNN-LSTM混合神经网络在时间序列预测中的应用,并提供了完整的Matlab代码实现。该模型结合了卷积神经网络(CNN)在特征提取方面的优势与长短期记忆网络(LSTM)在处理时序依赖问题上的强大能力,形成一种高效的混合预测架构。通过贝叶斯优化算法自动调参,提升了模型的预测精度与泛化能力,适用于风电、光伏、负荷、交通流等多种复杂非线性系统的预测任务。文中还展示了模型训练流程、参数优化机制及实际预测效果分析,突出其在科研与工程应用中的实用性。; 适合人群:具备一定机器学习基基于贝叶斯优化CNN-LSTM混合神经网络预测(Matlab代码实现)础和Matlab编程经验的高校研究生、科研人员及从事预测建模的工程技术人员,尤其适合关注深度学习与智能优化算法结合应用的研究者。; 使用场景及目标:①解决各类时间序列预测问题,如能源出力预测、电力负荷预测、环境数据预测等;②学习如何将CNN-LSTM模型与贝叶斯优化相结合,提升模型性能;③掌握Matlab环境下深度学习模型搭建与超参数自动优化的技术路线。; 阅读建议:建议读者结合提供的Matlab代码进行实践操作,重点关注贝叶斯优化模块与混合神经网络结构的设计逻辑,通过调整数据集和参数加深对模型工作机制的理解,同时可将其框架迁移至其他预测场景中验证效果。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值