цифровая электроника
вычислительная техника
встраиваемые системы

 
» » Программирование на языке С. Структуры, объединения и выравнивания данных

Программирование на языке С. Структуры, объединения и выравнивания данных

Автор: Mike(admin) от 10-01-2019, 02:35

Структуры, объединения и выравнивание данных


Структуры


В языке С существуют два механизма для создания типов данных путем объединения объектов различных типов: структуры, которые объявляются посредством ключевого слова struct, в результате чего многочисленные объекты объединяются в единую конструкцию; и объединения, которые объявляются посредством ключевого слова union и позволяют ссылаться на объекты, используя с этой целью несколько различных типов.


Объявление struct в языке С создает тип данных, который группирует объекты, возможно, различных типов, в один объект. К различным компонентам структуры можно обращаться по их именам. Реализация структур подобна реализации массивов в том смысле, что все компоненты структуры расположены в смежных участках памяти, а указателем на структуру служит адрес ее первого байта. Компилятор сохраняет информацию о каждом типе структуры, в частности смещение в байтах каждого поля. Он генерирует ссылки на элементы структуры, используя эти смещения как сдвиги в командах, ссылающихся на ячейки в памяти.


Конструктор типа данных struct языка С больше, чем какое-либо другое языковое средство приближается к объектам, применяемых в языках C++ и Java. Он позволяет программисту сохранять информацию о том или ином логическом объекте в одной структуре данных и ссылаться на нее по именам элементов.


Объединения и выравнивание данных


Объединения предоставляют способ обойти систему типов языка С, позволяя ссылаться на конкретный объект в соответствии с множеством типов. Синтаксис объявления объединения идентичен синтаксису объявления структур, в то же время их семантики существенно различаются. Вместо того чтобы поля ссылались на различные блоки памяти, они осуществляют ссылку на один и тот же блок.


Многие компьютерные системы накладывают ограничения на допустимые адреса для простых типов данных, требующие, чтобы адреса для некоторых типов объектов были кратными некоторому заданному значению. Соблюдение таких условий выравнивания упрощает конструирование аппаратных средств, обеспечивающих интерфейс между процессором и системой памяти. Например, предположим, что процессор при каждом обращении к памяти извлекает из нее 8 байтов по адресу, кратному 8. Если мы можем обеспечить, чтобы любое значение double было выровнено таким образом, что его адрес был кратным 8, то это значение можно считать из памяти или записать в память посредством одной операции. В противном случае придется дважды обращаться к памяти, поскольку объект может быть расположен в двух 8-байтовых блоках памяти.


Аппаратные средства с архитектурой IA32 будут работать правильно независимо от выравнивания данных. Тем не менее, компания Intel рекомендует выравнивать данные с целью повышения производительности системы памяти. Операционная система Linux следует стратегии выравнивания, согласно которой 2-байтовые типы данных должны иметь адреса, кратные двум, в то время как более крупные типы данных должны иметь адреса, кратные 4. Обратите внимание на то, что это требование означает, что наименьший значащий разряд адреса объекта типа short должен быть равен 0. Аналогично, любой объект типа int или любой указатель должны быть расположены в памяти по адресу, два наименьших значащих разряда которого равны нулю.




© digitrode.ru


Теги: язык C



   Благодарим Вас за интерес к информационному проекту digitrode.ru.
   Если Вы хотите, чтобы интересные и полезные материалы выходили чаще, и было меньше рекламы,
   Вы можее поддержать наш проект, пожертвовав любую сумму на его развитие.


Уважаемый посетитель, Вы зашли на сайт как незарегистрированный пользователь.
Мы рекомендуем Вам зарегистрироваться либо войти на сайт под своим именем.

Комментарии:

Оставить комментарий