cpp / expert
Snippet
In-place-Konstruktion in rohen Array-Puffern
Dieses Beispiel zeigt, wie man Speicher manuell mit 'placement new' innerhalb eines vorallozierten Stack-Puffers verwaltet. Diese Technik vermeidet den Overhead dynamischer Speicherallozierung und stellt sicher, dass Objekte korrekt ausgerichtet und nur bei Bedarf konstruiert werden.
snippet.cpp
cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <new>#include <memory>template <typename T, std::size_t Capacity>class ManualBuffer {alignas(T) char buffer[Capacity * sizeof(T)];std::size_t count = 0;public:template <typename... Args>void emplace_back(Args&&... args) {if (count >= Capacity) return;new (buffer + (count * sizeof(T))) T(std::forward<Args>(args)...);count++;}~ManualBuffer() {for (std::size_t i = 0; i < count; ++i) {reinterpret_cast<T*>(buffer + (i * sizeof(T)))->~T();}}};
Erklärung
1
alignas(T) char buffer[...];
Alloziert ein rohes Byte-Array mit den korrekten Ausrichtungsanforderungen für Typ T.
2
new (buffer + ...) T(...);
Verwendet placement new, um ein Objekt an einer bestimmten Speicheradresse zu konstruieren.
3
reinterpret_cast<T*>(...)->~T();
Ruft explizit den Destruktor für manuell konstruierte Objekte auf, bevor der Puffer zerstört wird.