0 Tage Serie
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.