Массивы структурных переменных. Правила выравнивания структурных переменных в памяти
По заданному шаблону структуры можно описывать массивы структурных переменных. Описание такого массива ничем не отличается от описания массива обычных переменных. Так, например, выглядит описание массива из 25 элементов:
typedef struct {
char name[20];
char title[44];
int year; float price;
} BOOKS;
BOOKS library[25];
Доступ к элементам массива может выполняться с использованием индекса или через указатель-константу, которым является имя массива. Например, так можно выполнить доступ к полю year i-го элемента:
library[i].year = 1928; или
(*(library+i)).year = 1928; или
(library+i)->year = 1928;
А если описать рабочий указатель и инициализировать его адресом первого элемента массива
BOOKS library[25], *ptr = library;
то для доступа к полям i-го элемента массива структурных переменных можно использовать указатель ptr:
(ptr+i)->year = 1928;
Продвижение указателя ptr операцией ++ или -- соответственно увеличивает или уменьшает его на размер типа BOOKS, т.е. устанавливает на следующий элемент массива структурных переменных вперед или назад. Это удобно при последовательном доступе к элементам массива.
Выделение оперативной памяти структурной переменной осуществляется по шаблону, интерпретируемому слева направо. При этом учитывается дополнительный фактор, называемый выравниванием структуры (Structure Alignement). Выравнивание задается либо как опция IDE (Options-Code Generation-Alignement), либо опцией компилятора командной строки. Может быть задано выравнивание структурной переменной на границе слова (Word Alignement в IDE), опция –а компилятора командной строки или на границе байта (Byte Alignement в IDE. Oпция –а – компилятора командной строки; принимается по умолчанию).
При выравнивании структурной переменной на границе байта отдельные ее поля в памяти располагаются без «зазоров». Начинаться переменная будет с любого (четного или нечетного) адреса; ее длина равна сумме длин полей шаблона. При выравнивании на границе слова компилятор при размещении структурной переменной в памяти вставляет между ее полями и между элементами массива структурных переменных пустые байты для того, чтобы соблюдались следующие правила:
отдельная структурная переменная (элемент массива структурных переменных) начинается на границе слова, т.е. с четного адреса;
любое поле, тип которого не совпадает с типом char, будет начинаться с четного адреса (имеет четное смещение от начала структурной переменной);
при необходимости в конце структурной переменной добавляется еще один байт так, чтобы число байтов переменной было четным.
Выравнивание сказывается критическим образом при переносе структурных переменных между диском и памятью.[Касаткин, II].
Дата добавления: 2017-01-29; просмотров: 925;