Вирівнювання та Заповнення у Структурах
Вирівнювання
Кожне поле структури вирівнюється до межі, яка є кратною розміру найбільшого елемента структури.
Наприклад, якщо найбільший елемент має розмір 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 байтів. Дотримуються правила вирівнювання, і пам'ять використовується ефективно.
Дякуємо за ваш відгук!
Запитати АІ
Запитати АІ
Запитайте про що завгодно або спробуйте одне із запропонованих запитань, щоб почати наш чат
Чудово!
Completion показник покращився до 4.35
Вирівнювання та Заповнення у Структурах
Свайпніть щоб показати меню
Вирівнювання
Кожне поле структури вирівнюється до межі, яка є кратною розміру найбільшого елемента структури.
Наприклад, якщо найбільший елемент має розмір 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 байтів. Дотримуються правила вирівнювання, і пам'ять використовується ефективно.
Дякуємо за ваш відгук!