作者fumizuki (小狮子)
看板Visual_Basic
标题Re: [VB6 ] VB6 是如何实做字串阵列的?
时间Tue Jun 14 17:56:15 2005
※ 引述《Daira (Daira)》之铭言:
: 因为最近写的程式会需要建立一个庞大的字串阵列做排序及读写
: 举列来说 Dim S(n) As String,n 可能大於 10 ^ 5
: 因此想了解 VB6 对字串阵列的实做方式,以及如何能加速并节省记忆体
: 以 C 的观点来看,每一个字串都是一个 Char Array
: 因此如果要在 C 中建立字串阵列,可以直接开一个二维 Char Array
: 但缺点是每一个字串的长度必须固定,当字串长度差异很大时,很多记忆体是浪费的
: 不然就是开一个 Char Pointer Array,然後另外动态配置记忆体给每一个字串
: 这样虽然记忆体省下了,但每次变动字串就必须重新配置记忆体长度
: 尤其是在排序时,字串会有大量的变动(这里假设不能直接交换 Pointer)
: 不知道 VB6 的字串阵列是哪一种做法(我这里指的是 VB 的动态长度字串)
: 如果是方法一,那是不是在字串变动时,等於整个阵列都要重新配置记忆体
: 又如果遇到这种情形,有没有什麽方法可以做到速度和空间的最佳化
不知道你要的是哪一种?
固定字串: '长度 = n
Dim S As String * 3 '长度固定为 3
S = "12" '会自动填上一个空白(强制)
S = "123"
S = "1234" '4 会被截掉
变动字串: '0 <= 长度 <= 2147483648
Dim S As String '长度为 0
S = "12" '长度为 2
S = "123" '长度为 3
S = "1234" '长度为 4
字串阵列: 'n + 1 <= 长度 <= 2147483648 * (n + 1)
Dim S(3) As String '长度为 0 * (3 + 1) = 0
S(0) = "Visual Basic" '目前长度为 12 + (0 * 3) = 12
S(1) = "Visual C++" '目前长度为 12 + 10 + (0 * 2) = 22
S(2) = "VS.NET" '目前长度为 12 + 10 + 6 + 0 = 28
S(3) = "Quick Basic" '目前长度为 12 + 10 + 6 + 11 = 39
Redim Preserve S(5) '目前长度为 12 + 10 + 6 + 11 + 0 + 0 = 39
S(4) = "Real Basic" '目前长度为 12 + 10 + 6 + 11 + 10 + 0 = 49
Redim S(20) '目前长度为 0 * (20 + 1) = 0 (内容被清空)
字元阵列: '长度 = n + 1
Dim b() As Byte '不可指定长度,目前长度为0
b = "长江一号" '目前长度为8
b = "要你命3000" '目前长度为10
Debug.Print b '输出:「要你命3000」
ReDim b(3) As Byte '目前长度为 3 + 1 = 4
b(0) = 209
b(1) = 158
b(2) = 65
Debug.Print b '输出:「黑A」
b = "十字追魂棍 " '目前长度为11 (後面有个空白)
像 memcpy 那种东西,对应的是 CopyMemory,但是不太会用。
字元阵列好像不能用 CopyMemory? 我不确定,我试不出来就对了。
使用方法:
Dim S As String
s = Space(20)
CopyMemory ByVal StrPtr(s) + 10, ByVal StrPtr("黑龙江"), 6
Debug.Print s
输出:「 黑龙江 」
※ 自己在一般模组加上这行:
Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
--
VB 程式设计 仓木麻衣 PTT 星爷板 行列输入法
======================================================
Visual_Basic MaiKuraki Stephen Array
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 61.222.155.162
1F:推 Daira:感谢板主这麽细心的回答 ~^^~ 140.112.30.95 06/17