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

Вирівнювання та заповнення в структурах

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

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

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

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

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

main.c

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

question mark

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

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

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

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

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

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

Запитати АІ

expand

Запитати АІ

ChatGPT

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

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