Структуры данных
Что такое struct?
struct (структура) в C и C++ — это пользовательский тип данных,
который позволяет объединить несколько различных типов данных в одну логическую
единицу. Структуры используются для группировки связанных данных, таких как
записи или объекты. Вот основные характеристики struct:
-
Определение: Создание структуры с именем и набором полей.
struct Point { int x; int y; }; -
Создание экземпляра: Объявление переменной типа структуры и доступ к её полям.
struct Point p1; p1.x = 10; p1.y = 20; -
Инициализация: Инициализация полей структуры при создании экземпляра.
struct Point p2 = {30, 40}; -
Доступ к полям: Использование оператора точки (
.) для доступа к полям структуры.int xValue = p1.x; int yValue = p1.y;
Как определить размер структур?
Размер структуры в C и C++ определяется с помощью оператора sizeof:
struct Point {
int x;
int y;
};
int size = sizeof(struct Point); // Определяет размер структуры Point в байтах
Этот оператор возвращает размер в байтах, включая возможные выравнивания (padding).
Что такое выравнивание в структурах?
Выравнивание задаёт допустимую кратность адреса объекта, которую в C++ можно узнать через alignof. Padding представляет собой промежутки между полями и в конце структуры для соблюдения этих требований. Кратность определяется выравниванием типа, а не обязательно его размером.
Пример:
struct Example {
char a; // 1 байт
int b; // 4 байта, начинается на выровненном адресе
};
int size = sizeof(struct Example); // Может вернуть 8 байт вместо ожидаемых 5 из-за выравнивания
В этом примере между a и b может быть добавлено 3 байта выравнивания, чтобы b начиналось на адресе, кратном 4.
Что такое union? Каков его размер?
union позволяет разным членам занимать общую область памяти. Его размер достаточен для самого большого члена и может быть больше из-за выравнивания. В C++ обычно активен один член; читать другой допустимо лишь в предусмотренных стандартом случаях.
Пример:
union Data {
int i;
float f;
char c;
};
int size = sizeof(union Data); // Размер union будет равен размеру самого большого поля, в данном случае это int или float (обычно 4 байта)
В распространённой реализации с sizeof(int) == sizeof(float) == 4 этот union часто занимает 4 байта. Точный результат определяет sizeof(Data).