Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Leer Uitlijning en Opvulling in Structs | Structs en Geheugen Begrijpen
C-Structs Beheersen

bookUitlijning en Opvulling in Structs

Uitlijning

Elk veld van een structuur wordt uitgelijnd op een grens die een veelvoud is van de grootte van het grootste element van de structuur.

Bijvoorbeeld, als het grootste element 4 bytes groot is, wordt elk element uitgelijnd op een 4-byte grens.

Dit wordt gedaan om het geheugen sneller te kunnen benaderen en hardware-uitlijningsproblemen te voorkomen.

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; }

Je vraagt je misschien af waarom de grootte van struct Example 16 bytes is, terwijl elk veld wordt uitgelijnd op de grens van het grootste type, namelijk 8 bytes. Op het eerste gezicht lijkt het uitlijnen van alle drie de velden op 8 bytes te wijzen op een totale grootte van 24 bytes. In werkelijkheid werkt dit iets anders.

Het eerste veld a is een char en neemt 1 byte in beslag. Om ervoor te zorgen dat het volgende veld b van het type int op een 4-byte grens begint, voegt de compiler 3 bytes opvulling toe na a. Het veld b zelf neemt 4 bytes in beslag en is nu correct uitgelijnd.

Het volgende veld c is een double en moet op een 8-byte grens beginnen. De compiler voegt opvulling toe na b om c op het juiste adres te plaatsen. Het veld c beslaat 8 bytes.

In totaal: 1 byte voor a + 3 bytes opvulling + 4 bytes voor b + 8 bytes voor c = 16 bytes. De uitlijningsregels worden gevolgd en het geheugen wordt efficiënt gebruikt.

question mark

Waarom is de grootte van een struct vaak groter dan de som van de groottes van de afzonderlijke velden?

Select the correct answer

Was alles duidelijk?

Hoe kunnen we het verbeteren?

Bedankt voor je feedback!

Sectie 3. Hoofdstuk 2

Vraag AI

expand

Vraag AI

ChatGPT

Vraag wat u wilt of probeer een van de voorgestelde vragen om onze chat te starten.

Suggested prompts:

Can you explain why the struct isn't 24 bytes if the largest element is 8 bytes?

How does padding work in structs with different data types?

Can you show an example of how the memory layout looks for this struct?

bookUitlijning en Opvulling in Structs

Veeg om het menu te tonen

Uitlijning

Elk veld van een structuur wordt uitgelijnd op een grens die een veelvoud is van de grootte van het grootste element van de structuur.

Bijvoorbeeld, als het grootste element 4 bytes groot is, wordt elk element uitgelijnd op een 4-byte grens.

Dit wordt gedaan om het geheugen sneller te kunnen benaderen en hardware-uitlijningsproblemen te voorkomen.

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; }

Je vraagt je misschien af waarom de grootte van struct Example 16 bytes is, terwijl elk veld wordt uitgelijnd op de grens van het grootste type, namelijk 8 bytes. Op het eerste gezicht lijkt het uitlijnen van alle drie de velden op 8 bytes te wijzen op een totale grootte van 24 bytes. In werkelijkheid werkt dit iets anders.

Het eerste veld a is een char en neemt 1 byte in beslag. Om ervoor te zorgen dat het volgende veld b van het type int op een 4-byte grens begint, voegt de compiler 3 bytes opvulling toe na a. Het veld b zelf neemt 4 bytes in beslag en is nu correct uitgelijnd.

Het volgende veld c is een double en moet op een 8-byte grens beginnen. De compiler voegt opvulling toe na b om c op het juiste adres te plaatsen. Het veld c beslaat 8 bytes.

In totaal: 1 byte voor a + 3 bytes opvulling + 4 bytes voor b + 8 bytes voor c = 16 bytes. De uitlijningsregels worden gevolgd en het geheugen wordt efficiënt gebruikt.

question mark

Waarom is de grootte van een struct vaak groter dan de som van de groottes van de afzonderlijke velden?

Select the correct answer

Was alles duidelijk?

Hoe kunnen we het verbeteren?

Bedankt voor je feedback!

Sectie 3. Hoofdstuk 2
some-alt