Вирівнювання та Заповнення у Структурах
Свайпніть щоб показати меню
Вирівнювання
Кожне поле структури вирівнюється до межі, яка є кратною розміру найбільшого елемента структури.
Наприклад, якщо найбільший елемент має розмір 4 байти, то кожен елемент буде вирівняний по 4-байтовій межі.
Це робиться для прискорення доступу до пам'яті та уникнення апаратних проблем із вирівнюванням.
main.c
1234567891011121314151617181920#include <stdio.h> // simple struct struct Example { char a; int b; double c; }; int main() { struct Example test; printf("Size of struct Example: %zu\n", sizeof(test)); printf("Address of test.x (char): %p\n", &test.a); printf("Address of test.y (int): %p\n", &test.b); printf("Address of test.c (double): %p\n", &test.c); return 0; }
Можливо, ви замислювалися, чому розмір struct Example становить 16 байт, хоча кожне поле вирівнюється до межі найбільшого типу, тобто 8 байт. На перший погляд, вирівнювання всіх трьох полів по 8 байтів може здатися, що загальний розмір буде 24 байти. Насправді це працює трохи інакше.
Перше поле a є типу char і займає 1 байт. Щоб наступне поле b типу int починалося з 4-байтової межі, компілятор додає 3 байти вирівнювання після a. Саме поле b займає 4 байти і тепер правильно вирівняне.
Наступне поле c є типу double і повинно починатися з 8-байтової межі. Компілятор додає вирівнювання після b, щоб розмістити c за правильною адресою. Поле c займає 8 байтів.
Усього: 1 байт для a + 3 байти вирівнювання + 4 байти для b + 8 байтів для c = 16 байтів. Дотримуються правила вирівнювання, і пам'ять використовується ефективно.
Дякуємо за ваш відгук!
Запитати АІ
Запитати АІ
Запитайте про що завгодно або спробуйте одне із запропонованих запитань, щоб почати наш чат