cpp / expert
Snippet
Bit-Ebene Metadaten-Einbettung in Pointern
Da Pointer auf modernen Systemen oft an 4 oder 8 Bytes ausgerichtet sind, sind die untersten Bits immer Null. Dieses Snippet nutzt dies aus, um zusätzliche Metadaten (ein 'Tag') direkt im Pointer selbst zu speichern, was den Speicherbedarf in komplexen Strukturen wie Bäumen oder Graphen reduziert.
snippet.cpp
cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <cstdint>template <typename T>class TaggedPointer {uintptr_t raw;static constexpr uintptr_t MASK = 0x03;public:TaggedPointer(T* ptr, uint8_t tag) {raw = reinterpret_cast<uintptr_t>(ptr) | (tag & MASK);}T* getPointer() const {return reinterpret_cast<T*>(raw & ~MASK);}uint8_t getTag() const {return static_cast<uint8_t>(raw & MASK);}};
Erklärung
1
uintptr_t raw;
Verwendet einen vorzeichenlosen Ganzzahltyp, der groß genug ist, um eine Pointer-Adresse zu speichern.
2
raw & ~MASK
Wendet eine Bitmaske an, um die Tag-Bits zu löschen und die ursprüngliche Speicheradresse abzurufen.
3
tag & MASK
Stellt sicher, dass der Tag-Wert nur die erlaubten unteren Bits belegt, um die Adresse nicht zu korrumpieren.