powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Выравнивание размера структуры
5 сообщений из 5, страница 1 из 1
Выравнивание размера структуры
    #33760577
pro-fan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте. Помогите пожалуйста разобраться с таким вопросом.
В моей программе есть структура полями которой являются разные типы данных. Когда я считаю ее размер с помощью функции LenB то оказывается что он больше действительного.
Код: plaintext
1.
2.
3.
4.
5.
 
Public Type MyType
  A As Integer
  B As Long
End Type
Размер такой структуры должен быть 6 байт. LenB возвращает значение 8 байт. Насколько я понял это происходит из-за выравнивания структуры в памяти по размеру поля с наибольшими размерами. Подскажите как посчитать настоящий размер структуры
...
Рейтинг: 0 / 0
Выравнивание размера структуры
    #33761526
Фотография Aklin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а ты в инт уверен? я из си читал инт как 4 байта.
а short - 2 байта.
Ну а лонг - понятно, всегда было 4.

Проверь инт. или читай структуру структурой (целиком), а не по полям.

Я читал целиком стуктуру из 12 полей ,в т.ч. 2 массива структур, 4 длиииинные подструктуры. Прим. чтение гораздо быстрее.

Прим. Возможно также, что VB приписывает нечто. Например официально массив из 12 байт весит 12 байт, но фактически - 12 + 4 на ubound+lbound = 16 (или около того).
...
Рейтинг: 0 / 0
Выравнивание размера структуры
    #33761814
bac
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Private Sub Command1_Click()
Dim xx As MyType
Print Len(xx)
End Sub

Выдает 6.

А уважаемый aklin путает С c VB. Да и там у Вас не все гладко.
Согласно ANSI в int хранится слово. А в зависимости о машины, версии компилятора может иметь разную длину. Для 16 разрядного компилятора Borland C, Microsoft C - 2 байта, для 32 - разрядного 4 байта, а для 64 - соответсвенно 8 байт.

А для VB по крайней мере VB4-6 (для VB.Net не знаю) одназначно 2 байта.
...
Рейтинг: 0 / 0
Выравнивание размера структуры
    #33762105
Фотография Бенедикт
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pro-fan,
LenB говорит правду - такая структура действительно занимает 8 байт.
HelpWith user-defined types, LenB returns the in-memory size, including any padding between elements.
В VB используется выравнивание элементов структуры (UDT) по границе 32-разрядного слова, т.е. 4 байт. Это значит, что элементы размером 1 байт выравниваются по границе байта (= не выравниваются), 2 байта (в т.ч. Integer) - по границе 16 бит, 4 байта и больше - по границе 32 бит. См. MSDN, Q171583. Кстати, поскольку, например, в C/C++ выравнивание можно указать индивидуально для структуры, многие структуры в Win32 API имеют первым полем размер структуры - чтобы было понятно, какое выравнивание было к ним в прикладной программе применено.

Для примера возьмём MyType и убедимся, что и как в ней распологается:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
Public Type MyType
   A As Integer
   B As Long
End Type

Private Type MyType2
   S( 0  To  7 ) As Byte
End Type

Public Sub PrintMyTypeBytes()
 Dim x As MyType
 Dim y As MyType2
 Dim i As Long
 x.A = &H201
 x.B = &H6050403
 LSet y = x
 For i =  0  To  7 
    Debug.Print i, "&H" & Hex$(y.S(i))
 Next i
End Sub
...
Рейтинг: 0 / 0
Выравнивание размера структуры
    #33763457
pro-fan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Большое спасибо. Мне помогло использование функции Len вместо LenB. Все размеры считаются правильно.
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Выравнивание размера структуры
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]