Understanding Memory Layout of Structs
Свайпніть щоб показати меню
Структури пам'яті в мові програмування C відіграють ключову роль у розумінні того, як дані зберігаються та отримуються з пам'яті. Коли структура визначається в C, компілятор визначає, як розмістити її члени в пам'яті відповідно до правил вирівнювання та додавання заповнювачів.
Огляд основ роботи з виділенням пам'яті для структур у 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) між членами, щоб кожен член починався з адреси, кратної його розміру.
На зображенні видно, що перша частина пам'яті (світліша область) належить змінній char x, яка займає лише один байт. Після цього йдуть три порожні байти — це вирівнювання, яке автоматично додається компілятором, щоб наступний елемент починався з правильної адреси. Після вирівнювання зберігається змінна int y, яка займає чотири байти.
У результаті структура займає загалом вісім байтів: один для char, три для вирівнювання та чотири для int.
Така організація потрібна для того, щоб процесор міг ефективніше отримувати доступ до даних. Без вирівнювання доступ до членів структури займав би більше часу, і програма працювала б повільніше.
Дякуємо за ваш відгук!
Запитати АІ
Запитати АІ
Запитайте про що завгодно або спробуйте одне із запропонованих запитань, щоб почати наш чат