Efficiënt geheugengebruik met C-bitvelden
Probleem: ruimteverspilling bij vlaggen
Een struct met int vlaggen (0/1) gebruikt 4 bytes per vlag. Voor 2 vlaggen = 8 bytes, terwijl 2 bits volstaan.
Oplossing: bitvelden
struct {
unsigned int breedteGevalideerd : 1;
unsigned int hoogteGevalideerd : 1;
} status;
Nu gebruikt status 4 bytes (één unsigned int), maar alleen 2 bits worden gebruikt. Tot 32 vlaggen van 1 bit passen in 4 bytes.
Declaratie-syntaxis
struct {
type [naam] : breedte;
};
| Element | Beschrijving |
|---|---|
type | int, signed int, unsigned int (en _Bool in C99+) |
naam | Lidnaam |
breedte | Aantal bits (≤ breedte van type) |
Voorbeeld: 3-bits leeftijd (0-7)
struct {
unsigned int leeftijd : 3;
} Leeftijd;
int main() {
Leeftijd.leeftijd = 4;
printf("Leeftijd: %d\n", Leeftijd.leeftijd); // 4
Leeftijd.leeftijd = 7;
printf("Leeftijd: %d\n", Leeftijd.leeftijd); // 7
Leeftijd.leeftijd = 8; // overflow!
printf("Leeftijd: %d\n", Leeftijd.leeftijd); // 0 (waarde modulo 8)
return 0;
}
Compiler waarschuwt bij overflow. Waarde wordt afgekapt (modulo 2^n).
Beperkingen en let-op
- Geen adres nemen (
&veldniet toegestaan) - Volgorde en padding zijn implementation-defined
- Niet portable voor binaire datauitwisseling (endianness, padding)
- Alleen integer-types (C99: ook
_Bool) - Array van bitvelden niet mogelijk
Toepassingen
- Statusvlaggen (bitset)
- Hardware-register mapping
- Gecomprimeerde datastructuren (netwerkpakketten, bestandsheaders)
- Boolean-achtige velden in grote arrays van structs
Moderne alternatief: Voor eenvoudige vlaggen overweeg
uint32_tmet bitwise operatoren (flags |= MASK,flags &= ~MASK) – meer controle, portable, vaak even snel.
C Taal
- C# Bitwise en Bit Shift Operators: Een Uitgebreide Gids
- Vier bewaarde patronen voor gebruiksgedefinieerde functies in C
- Hoe je 1D- en 2D-arrays doorgeeft aan functies in C – Een praktische gids
- C Structs en Pointers onder de knie krijgen: Een praktische gids
- C++ Structs Uitgelegd met een Praktisch Voorbeeld
- C-functies: Structuur, declaratie, aanroep en argumenten
- Variabele Argumenten in C: Een Praktische Gids
- C# Methodes: Definiëren, Aanroepen en Gebruiken van Functies
- MATLAB Integratie: Van Onbepaalde Integralen tot Riemann Sommen
- Java this-sleutelwoord uitgelegd: praktische toepassingen, constructors en meer
- Java encapsulatie meesteren: een praktische gids tot data hiding