Industriële fabricage
Industrieel internet der dingen | Industriële materialen | Onderhoud en reparatie van apparatuur | Industriële programmering |
home  MfgRobots >> Industriële fabricage >  >> Industrial programming >> C Taal

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;
};
ElementBeschrijving
typeint, signed int, unsigned int (en _Bool in C99+)
naamLidnaam
breedteAantal 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 (&veld niet 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_t met bitwise operatoren (flags |= MASK, flags &= ~MASK) – meer controle, portable, vaak even snel.

C Taal

  1. C# Bitwise en Bit Shift Operators: Een Uitgebreide Gids
  2. Vier bewaarde patronen voor gebruiksgedefinieerde functies in C
  3. Hoe je 1D- en 2D-arrays doorgeeft aan functies in C – Een praktische gids
  4. C Structs en Pointers onder de knie krijgen: Een praktische gids
  5. C++ Structs Uitgelegd met een Praktisch Voorbeeld
  6. C-functies: Structuur, declaratie, aanroep en argumenten
  7. Variabele Argumenten in C: Een Praktische Gids
  8. C# Methodes: Definiëren, Aanroepen en Gebruiken van Functies
  9. MATLAB Integratie: Van Onbepaalde Integralen tot Riemann Sommen
  10. Java this-sleutelwoord uitgelegd: praktische toepassingen, constructors en meer
  11. Java encapsulatie meesteren: een praktische gids tot data hiding