特例情况下,用array of char代替string减少内存占用

特例情况下,用array of char代替string减少内存占用

http://hi.baidu.com/auwage/blog/item/0d7002014652c718738b65cf.html
2009-06-17 08:16

       这个问题是在年初时发现的,我的一个小软件中,从xml文件载入约总大小约多于2M的string到类中,总共string的约20W多条,也就是这 20W条string加在一起的内存大小只有2M,不过怪了,程序运行起来,占用物理内存为110M,我赶忙查一下虚拟内存,乖乖,还是110M,
      这个事情起初是用户向我反映的,由于,从用户的角度出发,用户就是上帝,我不敢怠慢,活生生地查内存,看有没有泄露,看有没有多余的内存没有及时释放,结果发现都没有,为这个问题一直百思不得其解。忙活了一个多星期,
     试了好多次,改属性为shortstring为25M,改属性为String[64]为12M,看来不可能是我内存得用不当,那就是编译器的问题,联想到 string的最大内存为2G,所以估计是delphi在分配string内存时,在其后预留一段空内存以防止string的长度突然改变后不至于再重再 在一个新的地址段上分配一个更大string内存,而是在其后面resize就行。这就是说string相对于string[n]或者 shortstring在分配内存上更零星一点,这个设计思想是没有错,把内存与系统性能中和在一起考虑,但是它没有考虑极端的情况(string特别 多),本来string特别多也没事,但是对于windows内存管理器来说,他只是计算内存开始的地方到结束的地方为这个应用程序总共占用内存信息。它 也不可能逐个地计算实实在在的内存,否则它不累死才怪.这个也没有错,但是用户可不干了,在他看来,你的小程序它的内存都给占了,哪个还敢用的你软件呢?
     这个问题搞明白之后,我本想以string[64]做为类的属性。反正那些字串最大长度不会超过64。但是后来发现这个也行不通,因为string[n] 英文系统下会乱码,也就是失去unicode的意义,在试验了很多次后,终于想到了还有一种方法代替string而又不会出现乱码,array of char;还好,老天帮忙,array of char不像string分配那样“空虚”,整个程序运行起来,物理内存和虚拟内存都在26M,合情合事,哈哈.
     这个问题我曾向cnpack的zjy提过,他当时没有reproduce我的情况,可能是我没有告诉他是在什么版本才会有原因.  
     以上是在Delphi2009出现,之外的版本我没有测试过.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值