Перейти к содержимому
шпаргалка.
Esc
навигацияоткрыть⌘Jпредпросмотр
На этой странице

Структуры данных

Все темы C++ Developer

Что такое struct?

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

  1. Определение: Создание структуры с именем и набором полей.

    struct Point {
        int x;
        int y;
    };
  2. Создание экземпляра: Объявление переменной типа структуры и доступ к её полям.

    struct Point p1;
    p1.x = 10;
    p1.y = 20;
  3. Инициализация: Инициализация полей структуры при создании экземпляра.

    struct Point p2 = {30, 40};
  4. Доступ к полям: Использование оператора точки ( .) для доступа к полям структуры.

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

Эта страница была полезной?