c / expert
Snippet
Allokation flexibler Array-Elemente und Speicherlayout-Optimierung
C99 führte flexible Array-Elemente (FAMs) ein, die es ermöglichen, eine Struktur mit einem unvollständigen Array-Typ zu beenden. Diese Technik erlaubt einen einzelnen malloc-Aufruf, um sowohl Deskriptor-Metadaten als auch zusammenhängende dynamische Nutzdaten zu allokieren. Dies maximiert die Cache-Lokalität und eliminiert den Overhead zweiter Zeiger-Dereferenzierungen im Vergleich zu separaten Heap-Zeigern.
snippet.c
c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <stdio.h>#include <stdlib.h>#include <string.h>typedef struct {size_t length;char payload[]; /* C99 Flexible Array Member */} DynamicBuffer;DynamicBuffer* create_buffer(const char *data) {size_t len = strlen(data);/* Allocate header and variable payload in a single contiguous memory block */DynamicBuffer *buf = malloc(sizeof(DynamicBuffer) + len + 1);if (!buf) return NULL;buf->length = len;memcpy(buf->payload, data, len + 1);return buf;}int main(void) {DynamicBuffer *buf = create_buffer("Expert C Memory Layout");if (buf) {printf("Len: %zu, Content: %s\n", buf->length, buf->payload);free(buf);}return 0;}
Erklärung
1
char payload[]; /* C99 Flexible Array Member */
Deklariert ein nachfolgendes Array ohne Größenangabe in der Struct, das null Bytes zu sizeof(DynamicBuffer) beiträgt.
2
DynamicBuffer *buf = malloc(sizeof(DynamicBuffer) + len + 1);
Allokiert einen zusammenhängenden Speicherbereich für Struct-Header-Metadaten und Nutzdaten.