Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Вивчайте Вирівнювання та Заповнення у Структурах | Розуміння Структур і Пам'яті
Practice
Projects
Quizzes & Challenges
Quizzes
Challenges
/
Опанування Структур у C

bookВирівнювання та Заповнення у Структурах

Вирівнювання

Кожне поле структури вирівнюється до межі, яка є кратною розміру найбільшого елемента структури.

Наприклад, якщо найбільший елемент має розмір 4 байти, то кожен елемент буде вирівняний по 4-байтовій межі.

Це робиться для прискорення доступу до пам'яті та уникнення апаратних проблем із вирівнюванням.

main.c

main.c

copy
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 байтів. Дотримуються правила вирівнювання, і пам'ять використовується ефективно.

question mark

Чому розмір struct часто перевищує суму розмірів його окремих полів?

Select the correct answer

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

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

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

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

Запитати АІ

expand

Запитати АІ

ChatGPT

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

bookВирівнювання та Заповнення у Структурах

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

Вирівнювання

Кожне поле структури вирівнюється до межі, яка є кратною розміру найбільшого елемента структури.

Наприклад, якщо найбільший елемент має розмір 4 байти, то кожен елемент буде вирівняний по 4-байтовій межі.

Це робиться для прискорення доступу до пам'яті та уникнення апаратних проблем із вирівнюванням.

main.c

main.c

copy
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 байтів. Дотримуються правила вирівнювання, і пам'ять використовується ефективно.

question mark

Чому розмір struct часто перевищує суму розмірів його окремих полів?

Select the correct answer

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

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

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

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