---
title: Структуры данных
seo:
  title: Структуры данных — C++ Developer
  description: Тема «Структуры данных» для собеседования C++ Developer. Что такое struct? Как определить размер структур?
---

[Все темы C++ Developer](/c-developer)

## <strong>Что такое</strong> <code>struct</code><strong>?</strong> [#q-14bee738d69b810ea871f6a8a1ce9305]

<code>struct</code> (структура) в C и C++ — это пользовательский тип данных,
который позволяет объединить несколько различных типов данных в одну логическую
единицу. Структуры используются для группировки связанных данных, таких как
записи или объекты. Вот основные характеристики <code>struct</code>&#58;

1. <strong>Определение</strong>&#58; Создание структуры с именем и набором
   полей.

   ```cpp
   struct Point {
       int x;
       int y;
   };
   ```

1. <strong>Создание экземпляра</strong>&#58; Объявление переменной типа
   структуры и доступ к её полям.

   ```cpp
   struct Point p1;
   p1.x = 10;
   p1.y = 20;
   ```

1. <strong>Инициализация</strong>&#58; Инициализация полей структуры при
   создании экземпляра.

   ```cpp
   struct Point p2 = {30, 40};
   ```

1. <strong>Доступ к полям</strong>&#58; Использование оператора точки (
   <code>&#46;</code>) для доступа к полям структуры.

   ```cpp
   int xValue = p1.x;
   int yValue = p1.y;
   ```

:::note[Ссылки для изучения]

1. [Структуры данных в C](https://metanit.com/c/tutorial/6.1.php)
   :::

---

## <strong>Как определить размер структур?</strong> [#q-14bee738d69b8188b749c20feae8bd87]

Размер структуры в C и C++ определяется с помощью оператора <code>sizeof</code>&#58;

```cpp
struct Point {
    int x;
    int y;
};

int size = sizeof(struct Point);  // Определяет размер структуры Point в байтах
```

Этот оператор возвращает размер в байтах, включая возможные выравнивания <code>&#40;padding&#41;</code>.

:::note[Ссылки для изучения]

1. [Структуры данных в C](https://metanit.com/c/tutorial/6.1.php)
   :::

---

## <strong>Что такое выравнивание в структурах?</strong> [#q-14bee738d69b8194bb32e4407649b7ac]

Выравнивание задаёт допустимую кратность адреса объекта, которую в C++ можно узнать через alignof. Padding представляет собой промежутки между полями и в конце структуры для соблюдения этих требований. Кратность определяется выравниванием типа, а не обязательно его размером.

Пример&#58;

```cpp
struct Example {
    char a;  // 1 байт
    int b;   // 4 байта, начинается на выровненном адресе
};

int size = sizeof(struct Example);  // Может вернуть 8 байт вместо ожидаемых 5 из-за выравнивания
```

В этом примере между <code>a</code> и <code>b</code> может быть добавлено 3 байта выравнивания, чтобы <code>b</code> начиналось на адресе, кратном 4.

:::note[Ссылки для изучения]

1. [Структуры данных в C](https://metanit.com/c/tutorial/6.1.php)
   :::

---

## <strong>Что такое</strong> <code>union</code><strong>? Каков его размер?</strong> [#q-14bee738d69b81b68516cc21e6ad4c63]

union позволяет разным членам занимать общую область памяти. Его размер достаточен для самого большого члена и может быть больше из-за выравнивания. В C++ обычно активен один член; читать другой допустимо лишь в предусмотренных стандартом случаях.

Пример&#58;

```cpp
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).

:::note[Ссылки для изучения]

1. [Структуры данных в C](https://metanit.com/c/tutorial/6.1.php)
   :::
