Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Вивчайте Understanding Memory Layout of Structs | Розуміння Структур і Пам'яті
Структури в C

Understanding Memory Layout of Structs

Свайпніть щоб показати меню

Структури пам'яті в мові програмування C відіграють ключову роль у розумінні того, як дані зберігаються та отримуються з пам'яті. Коли структура визначається в C, компілятор визначає, як розмістити її члени в пам'яті відповідно до правил вирівнювання та додавання заповнювачів.

Огляд основ роботи з виділенням пам'яті для структур у C:

main.c

main.c

123456789101112131415
#include <stdio.h> // simple struct struct Test { char x; // 1 byte int y; // 4 bytes }; int main() { struct Test example; printf("Size of struct Test: %zu\n", sizeof(example)); printf("Address of example.x (char): %p\n", &example.x); printf("Address of example.y (int): %p\n", &example.y); return 0; }

Як і очікувалося, така структура повинна займати 5 байтів: 1 байт для char x, 4 байти для int y, але фактично це буде 8 байтів.

Чому розмір структури значно більший, ніж ми очікували?

Це відбувається тому, що компілятор може вставляти вирівнювання (padding) між членами, щоб кожен член починався з адреси, кратної його розміру.

memory+8+bytes

На зображенні видно, що перша частина пам'яті (світліша область) належить змінній char x, яка займає лише один байт. Після цього йдуть три порожні байти — це вирівнювання, яке автоматично додається компілятором, щоб наступний елемент починався з правильної адреси. Після вирівнювання зберігається змінна int y, яка займає чотири байти.

У результаті структура займає загалом вісім байтів: один для char, три для вирівнювання та чотири для int.

Така організація потрібна для того, щоб процесор міг ефективніше отримувати доступ до даних. Без вирівнювання доступ до членів структури займав би більше часу, і програма працювала б повільніше.

question mark

Чому sizeof(struct Test) повертає 8 замість 5?

Виберіть правильну відповідь

Все було зрозуміло?

Як ми можемо покращити це?

Дякуємо за ваш відгук!

Секція 3. Розділ 1

Запитати АІ

expand

Запитати АІ

ChatGPT

Запитайте про що завгодно або спробуйте одне із запропонованих запитань, щоб почати наш чат

Секція 3. Розділ 1
some-alt