Uitlijning 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
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.
Bedankt voor je feedback!
Vraag AI
Vraag AI
Vraag wat u wilt of probeer een van de voorgestelde vragen om onze chat te starten.
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?
Geweldig!
Completion tarief verbeterd naar 4.35
Uitlijning 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
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.
Bedankt voor je feedback!