Массивы структурных переменных. Правила выравнивания структурных переменных в памяти

 

По заданному шаблону структуры можно описывать массивы структурных переменных. Описание такого массива ничем не отличается от описания массива обычных переменных. Так, например, выглядит описание массива из 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; просмотров: 862;


Поиск по сайту:

При помощи поиска вы сможете найти нужную вам информацию.

Поделитесь с друзьями:

Если вам перенёс пользу информационный материал, или помог в учебе – поделитесь этим сайтом с друзьями и знакомыми.
helpiks.org - Хелпикс.Орг - 2014-2024 год. Материал сайта представляется для ознакомительного и учебного использования. | Поддержка
Генерация страницы за: 0.006 сек.