c / expert
Snippet
Bitfelder und strukturelles Speicher-Packing
Bitfelder ermöglichen die Definition von Strukturmerkmalen mit expliziter Bitbreite. Dies ist essenziell für die hardwarenahe Programmierung oder das Komprimieren von Daten für Netzwerkprotokolle. Das Layout von Bitfeldern ist jedoch implementierungsabhängig, was bedeutet, dass Reihenfolge und Padding zwischen Compilern und Architekturen variieren können.
snippet.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <stdio.h>#include <stdint.h>struct NetworkFlags {uint8_t is_active : 1;uint8_t protocol : 3;uint8_t priority : 4;};int main() {struct NetworkFlags flags = {1, 5, 12};printf("Size of struct: %zu byte\n", sizeof(flags));printf("Active: %u, Proto: %u, Prio: %u\n",flags.is_active, flags.protocol, flags.priority);return 0;}
Erklärung
1
uint8_t is_active : 1;
Reserviert genau 1 Bit für das 'is_active'-Flag innerhalb einer uint8_t-Speichereinheit.
2
sizeof(flags)
Selbst bei mehreren Bitfeldern packt der Compiler diese in die kleinstmöglichen zugrunde liegenden Ganzzahltypen.