在VB6中,我可以在UDT中使用固定或可变长度的字符串:
Public Type MyRecord
VariableLengthString As String
FixedLengthString As String * 80
End Type
我希望FixedLengthString
在UDT中分配160个字节,如果我有这些UDT的数组,则固定长度的字符串数据是内联的。
VariableLengthString
发生了什么?它是在堆上分配的吗?
因此,如果我这样做:
Dim record1 As MyRecord
Dim record2 As MyRecord
record1.VariableLengthString = "a"
record2 = record1
......显然record2.VariableLengthString
将是"a"
。但是,如果我这样做:
record2.VariableLengthString = "b"
...那么record1.VariableLengthString
的价值是什么?
更新:结果仍然是"a"
,这意味着字符串已被复制。所以它不在堆上吗?
我的测试代码:
record1.VariableLengthString = "a"
record2 = record1
? record2.VariableLengthString
a
record2.VariableLengthString = "b"
? record1.VariableLengthString
a
答案 0 :(得分:2)
基本上“as string”在VB6中分配BSTR。 OLE(VB6的基础技术)以特殊方式处理BSTR,包括维护缓存以更快地进行字符串操作。 MSDN中的这个article on String Manipulation更详细地解释了它。 UDT指向BSTR结构,该结构基本上是32位长度字段,后跟字符串的字符。它是Unicode识别的。分配给BSTR的空间是4个字节+存储字符的字节数。所以变量不像固定长度字符串那样固定。