Заполнение структур
Заполнение структур
Структуры заполняются таким образом, чтобы каждый ее элемент имел естественное выравнивание. Например, рассмотрим следующую структуру данных на 32- разрядной машине.
struct animal_struct {
char dog; /* 1 байт */
unsigned long cat; /* 4 байт */
unsigned short pig; /* 2 байт */
char fox; /* 1 байт */
};
Эта структура данных в памяти выглядит не так, что связано с необходимостью естественного выравнивания. В памяти компилятор создает структуру данных, которая похожа на следующую.
struct animal_struct {
char dog; /* 1 байт */
u8 __pad0[3]; /* 3 байт */
unsigned long cat; /* 4 байт */
unsigned short pig; /* 2 байт */
char fox; /* 1 байт */
u8 __pad1; /* 1 байт */
};
Переменные заполнения вводятся для того, чтобы обеспечить естественное выравнивание всех элементов структуры. Первая переменная заполнения вводит дополнительные затраты памяти для того, чтобы разместить поле cat на границе 4-байтового адреса. Вторая переменная используется для выравнивания размера самой структуры. Дополнительный байт гарантирует, что размер структуры будет кратен четырем байтам и что каждый элемент массива таких структур будет иметь естественное выравнивание.
Следует обратить внимание, что выражение sizeof (foo_struct) равно значению 12 для любого экземпляра этой структуры на большинстве 32-разрядных аппаратных платформ. Компилятор языка С автоматически добавляет элементы заполнения, чтобы гарантировать необходимое выравнивание.
Часто имеется возможность переставить поля структуры так, чтобы избежать необходимости заполнения. Это позволяет получить правильно выровненные данные без введения дополнительных элементов заполнения и, соответственно, структуру меньшего размера.
struct animal struct {
unsigned long cat; /* 4 байта */
unsigned short pig; /* 2 байта */
char dog; /* 1 байт */
char fox; /* 1 байт */
};
Эта структура данных имеет размер 8 байт. Однако не всегда существует возможность перестановки элементов структуры местами и изменения определения структуры. Например, если структура поставляется как часть стандарта, или уже используется в существующем коде, то порядок следования полей менять нельзя. Иногда, по некоторым причинам, может потребоваться специальный порядок следования полей структуры, например специальное выравнивание переменных для оптимизации попадания в кэш. Заметим, что, согласно стандарту ANSI С, компилятор никогда не должен менять порядок следования полей в структурах[95] данных — этим правом обладает только программист.
Разработчики ядра должны учитывать особенности заполнения при обмене структурами данных: передача структур по сети или непосредственное сохранение на диск, потому что необходимое заполнение может быть разным для различных аппаратных платформ. Это одна из причин, по которой в языке программирования С нет оператора сравнения структур. Память, которая используется для заполнения структур данных, может содержать случайную информацию, что делает невозможным побайтовое сравнение структур. Разработчики языка, программирования С правильно сделали, что оставили решение задачи сравнения структур на усмотрение программиста, который может создавать свои функции сравнения в каждом конкретном случае, чтобы использовать особенности построения конкретных структур.
Более 800 000 книг и аудиокниг! 📚
Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением
ПОЛУЧИТЬ ПОДАРОКЧитайте также
Инициализация структур
Инициализация структур Структуры необходимо инициализировать, используя метки полей. Это позволяет предотвратить некорректную инициализацию при изменении структур. Это также позволяет выполнять инициализацию не всех полей. К сожалению, в стандарте C99 принят довольно
Сравнение структур адреса сокетов
Сравнение структур адреса сокетов На рис. 3.1 показано сравнение пяти структур адресов сокетов, с которыми мы встретимся в тексте, предназначенных для IPv4, IPv6, доменного сокета Unix (см. листинг 15.1), канального уровня (см. листинг 18.1) и хранения. Подразумевается, что все
ГЛАВА 3. ИСПОЛЬЗОВАНИЕ СТРУКТУР ДАННЫХ
ГЛАВА 3. ИСПОЛЬЗОВАНИЕ СТРУКТУР ДАННЫХ Оксфордский толковый словарь английского языка определяет слово «рекурсия» следующим образом:РЕКУРСИЯ. [Теперь употребляется редко, устаревшее.] Обратное движение, возвращение.Это определение загадочно и, по-видимому, устаревшее.
Создание обобщенных структур (и классов)
Создание обобщенных структур (и классов) Теперь, когда вы понимаете, как определять и вызывать обобщенные методы, давайте рассмотрим построение обобщенных структур (процедура построения обобщенных классов оказывается аналогичной). Предположим, что мы построили гибкую
Описание массива структур
Описание массива структур Процесс описания массива структур совершенно аналогичен описанию любого другого типа массива: struct book libry [MAXBKS];Этот оператор объявляет libry массивом, состоящим из MAXBKS-элементов. Каждый элемент массива представляет собой структуру типа book.
Определение элементов массива структур
Определение элементов массива структур При определении элементов массива структур мы применяем те же самые правила, которые используются для отдельных структур: сопровождаем имя структуры операцией получения элемента и именем элемента: libry [0].value value - первый
Глава 4 Использование структур: примеры
Глава 4 Использование структур: примеры Структуры данных вместе с сопоставлением, автоматическими возвратами и арифметикой представляют собой мощный инструмент программирования. В этой главе мы расширим навыки использования этого инструмента при помощи следующих
Автоматическое заполнение форм
Автоматическое заполнение форм Привычным атрибутом многих сайтов стала процедура регистрации. Подписка на рассылки новостей, получение нового электронного адреса, покупка программ через Интернет все эти услуги требуют регистрации и заполнения различного вида форм с
29.5.3. Заполнение списка
29.5.3. Заполнение списка Если HTML–страницы являются действительно динамическими, следует предусмотреть возможность заполнения списков или таблицы текущими данными, выбранными из существующего файла, вместо того, чтобы жестко кодировать эти данные в сценариях
Замечание о пустоте структур
Замечание о пустоте структур Предусловие в процедуре создания (конструкторе) make класса STACK1 требует комментария. Оно устанавливает n>=0 и, следовательно, допускает пустые стеки. Если n=0, то make вызовет процедуру создания для массивов, также имеющую имя make, с аргументами 1 и 0
§ 4.3 Заполнение заголовка книги
§ 4.3 Заполнение заголовка книги Перед тем, как приступить к набору или редактированию текста книги необходимо заполнить описание книги — Description.Это описание нужно, в первую очередь, для корректной работы библиотечного софта, но может быть интересно и читателю.Режим
4.4.8. Автоматическое заполнение форм
4.4.8. Автоматическое заполнение форм Браузер Safari может автоматически заполнять поля электронных форм, заимствуя информацию из вашей личной карточки адресной книги. Более того, вы можете дать указание Safari запоминать все пароли и логины, используемые вами для доступа к