Размер типа record

Общие вопросы программирования, алгоритмы и т.п.

Модератор: Модераторы

Ответить
giao
новенький
Сообщения: 46
Зарегистрирован: 24.11.2009 21:33:18
Откуда: Украина

Размер типа record

Сообщение giao »

Здравствуйте, форумчане. Возник вопрос с record'ами, точнее с их размером. Объявляю типы и переменные:

Код: Выделить всё

type

  trec1 = record
    ScanType: array[1..4] of Char;
    Nranges: Integer;
    ScanName: array[1..32] of Char;
    comment: array[1..128] of Char;
    DateTime: array[1..20] of Char;
  end;

  trec2 = record
    ScanType: array[1..4] of Char;
    Nranges: Integer;
    ScanName: array[1..32] of Char;
    comment: array[1..128] of Char;
    DateTime: array[1..20] of Char;
    anode: array[1..2] of Char;
  end;

....

var
size1, size2: integer;
x1: trec1;
x2: trec2;

...

size1:= sizeof(x1);
size2:= sizeof(x2);

Почему size1 = 188, a size2 = 192, а не 190? В Delphi7 та же хрень! Ничего не понимаю! :x
zub
долгожитель
Сообщения: 2889
Зарегистрирован: 14.11.2005 22:51:26
Контактная информация:

Сообщение zub »

выравнивание, пробуй

Код: Выделить всё

packed record
Аватара пользователя
stikriz
энтузиаст
Сообщения: 612
Зарегистрирован: 15.03.2006 08:37:47

Сообщение stikriz »

giao писал(а):Почему size1 = 188, a size2 = 192, а не 190? В Delphi7 та же хрень! Ничего не понимаю! :x

Потому, что компилятор для ускорения работы с памятью выравнивает рекорд по слову в зависимости от параметров. Чтобы выравнивал по байту (не выравнивал), как тут уже сказали, packed record.
giao
новенький
Сообщения: 46
Зарегистрирован: 24.11.2009 21:33:18
Откуда: Украина

Сообщение giao »

Спасибо, сегодня с утра и сам додумал. Забыл я как-то про выравнивание :)
Ответить