找回密码
 点一下
查看: 3474|回复: 18

[已解决]字符串泄漏?

[复制链接]
发表于 2008-7-31 08:38:24 | 显示全部楼层 |阅读模式
一直听说在魔兽里每创建一个字符串就会泄漏一个的说法~~有这回事么,这泄漏有多严重?谁能详细讲解以下~~
发表于 2008-7-31 10:57:28 | 显示全部楼层
第一次听到这种说法,至少从我的实践来看正常使用字符串不会造成什么不良后果
回复

使用道具 举报

发表于 2008-7-31 11:09:59 | 显示全部楼层
LS就是孤陋寡闻了。
回复

使用道具 举报

 楼主| 发表于 2008-7-31 11:14:39 | 显示全部楼层
我知道一点点原理,魔兽每创造一条字符串就会记录在案(会占内存),等到有相同的会再次调用(所以也不能完全说是泄漏),但我不清楚他是记录字符还是记录字符串,记录字符的话就要好很多了~毕竟奇怪的中文不会出现太多英文字母和数字符号也都是有限的~但如果是记录字符串问题就比较大了~调用的可能相对记录字符要小得多了~
回复

使用道具 举报

发表于 2008-7-31 11:17:57 | 显示全部楼层
字符串泄露只会影响字符串利用效率
就好比人多了就很难寻找其中的某一个一样
回复

使用道具 举报

发表于 2008-7-31 11:22:53 | 显示全部楼层
字符串搜索可以用hash表,再多字符串也不会影响到速度

而字符串占用到的内存就更是可以忽略不计了
回复

使用道具 举报

发表于 2008-7-31 11:26:20 | 显示全部楼层
字符串占用的内存可以忽略,那是因为您的内存只有8GB吧?
回复

使用道具 举报

发表于 2008-7-31 11:33:23 | 显示全部楼层
1kb = 500个汉字
1mb = 50w个汉字

你一个地图想存要多少东西
回复

使用道具 举报

 楼主| 发表于 2008-7-31 11:53:44 | 显示全部楼层
ls想了太简单了
回复

使用道具 举报

发表于 2008-7-31 12:13:48 | 显示全部楼层
泄漏的是变量,不是字串本身。
回复

使用道具 举报

发表于 2008-7-31 12:37:55 | 显示全部楼层
这里指的是T里用字符串吧..
T用的字符串 似乎很奇怪...转成J的话
就会看到
回复

使用道具 举报

发表于 2008-7-31 12:47:07 | 显示全部楼层
好吧,既然你觉得我想得太简单了,那我就说得复杂些

首先肯定一点,字符串和handle在魔兽中是存放在不同的表中的。

不出意外字符串应该是用hash表来管理的,至少暴雪的程序员不会蠢到不会用hash表或者他有什么更好方法,不管怎么样,这可以确定一点的是字符串的管理都可以在常数时间内完成,也就是和表中的字符串多少无关。从这得出的结论就是,内存的字符串再多也不会影响读取速度。

对于第二个问题就是字符串占用内存问题,一般来来说每个字符串的储存除了它本身的值之外,还要存放它的hash值,引用数,和有限的几个指针,这些占用的空间确实是可以忽略不计的,所以我7楼说的虽然不是很准确,但也不会差很远。

第三就是因字符串连接等操作而产生的字符串是否会得到有效的清理。首先这个实现起来不难,相信暴雪的程序员也会,其次暴雪没有提供删除字符串的函数,那么他应该在内部实现了。



当然我上面的观点都是建立在暴雪的程序员还不算太笨的前提下,我觉得能做出这么优秀游戏的程序员对于这些应该是难不倒他的。

也许真的是我孤陋寡闻,我确实没有见到过因为字符串问题而卡机的地图,既然实践上没有问题,又何必去钻牛角尖呢
回复

使用道具 举报

发表于 2008-7-31 12:50:28 | 显示全部楼层
偶发过帖子的~~
http://www.islga.org/bbs/read.php?tid=3791
严格的说string不能算是泄露,应该说是由于泛滥产生的等同于泄漏的后果,
并且其后果要比点泄露严重很多,不过庆幸的是string是独占一块内存区域的,不会影响到其它handle对象的使用,只影响到string的使用效率(影响极大...)
hash函数是可以很高效,但对于War3的效率我一直不敢苟同......
回复

使用道具 举报

发表于 2008-7-31 13:24:24 | 显示全部楼层
测试中创建100万个7位数字转换的string需要占用200多M空间



实际应用中,不可能有这么多字符串的吧,写jass hash表的人也不会考虑到有地图要用到这么多的字符串


不过不会自动清理,确实有点差

string.w3x (13 KB, 下载次数: 34)
回复

使用道具 举报

发表于 2008-7-31 15:26:59 | 显示全部楼层
弄个1万个点,1万个string在一张测试图中你认为能看出什么效果来?所以量化是必须的~~
而且,100万个string的话也并不是什么难事,两个string变量的+运算就能很轻松的产生成千上万的string

对于war3的效率
当有人反映Max++1.1将txt文件中<AHbz,DataA1>类字符转化为整数后,地图Loading速度减少了5秒(同样是SLK优化之后),我已经对war3效率彻底无语了

例:召唤<ACs7,DataB1>条<osw1,realHP>点生命值的幽灵狼。 => 召唤2条450点生命值的幽灵狼。
回复

使用道具 举报

 楼主| 发表于 2008-7-31 16:56:32 | 显示全部楼层
set s="a"+"b"+"c"+"d"是创建五个字符串..还是排列组合后的结果。。
回复

使用道具 举报

发表于 2008-7-31 17:22:21 | 显示全部楼层
"a"
"b"
"c"
"d"
"ab"
"abc"
"abcd"
回复

使用道具 举报

发表于 2008-7-31 17:25:42 | 显示全部楼层
对于string有些地方是无奈的
平时注意I2S(h2i(u))+“xxx”这种格式的使用就好了~
回复

使用道具 举报

发表于 2008-8-1 01:58:39 | 显示全部楼层
我觉得I2S(h2i(u))+“xxx”的形式还能接受吧
一般可回收的handle值在一定范围内自动循环使用,写缓存的话格式(I2S(h2i(u))+“xxx”,“yy”)比(I2S(h2i(u)),“xx”)多用出handle1倍+1的字符串,作为增加一个missionkey的代价
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 点一下

本版积分规则

Archiver|移动端|小黑屋|地精研究院

GMT+8, 2024-5-8 18:37 , Processed in 0.092437 second(s), 21 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表