Как по-разному обрабатываются строки с фиксированной или переменной длиной в UDT VB6? - PullRequest
1 голос
/ 30 марта 2011

В VB6 я могу использовать строки фиксированной или переменной длины в UDT:

Public Type MyRecord
    VariableLengthString As String
    FixedLengthString As String * 80
End Type

Я бы ожидал, что FixedLengthString выделит 160 байтов в UDT, и если бы у меня был массив этихUDT, строковые данные фиксированной длины встроены.

Что происходит с VariableLengthString?Распределяется ли он в куче?

Поэтому, если я сделаю это:

Dim record1 As MyRecord
Dim record2 As MyRecord
record1.VariableLengthString = "a"
record2 = record1

... очевидно, record2.VariableLengthString будет "a".Но, если я сделаю это:

record2.VariableLengthString = "b"

... тогда какое значение будет record1.VariableLengthString?

Обновление : получается, что результатstill "a", что означает, что строка скопирована.Так разве это не в куче?

Мой тестовый код:

record1.VariableLengthString = "a"
record2 = record1
? record2.VariableLengthString
a
record2.VariableLengthString = "b"
? record1.VariableLengthString
a

1 Ответ

2 голосов
/ 30 марта 2011

В основном "как строка" выделяет BSTR в VB6.OLE (технология, лежащая в основе VB6) обрабатывает BSTR особым образом, включая поддержание кэша для ускорения работы со строками.Эта статья о манипулировании строками в MSDN объясняет это более подробно.UDT указывает на структуру BSTR, которая в основном представляет собой поле длиной 32 бита, за которым следуют символы строки.Это Unicode знает.Пространство, выделенное для BSTR, составляет 4 байта + количество байтов для хранения символов.Таким образом, переменная не является фиксированной, как строка фиксированной длины.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...