0 day streak
cpp / expert
Snippet

In-place Construction in Raw Array Buffers

This example shows how to manage memory manually using placement new within a pre-allocated stack buffer. This technique avoids dynamic memory allocation overhead and ensures that objects are aligned correctly and constructed only when needed.

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();
}
}
};
Breakdown
1
alignas(T) char buffer[...];
Allocates a raw byte array with the correct alignment requirements for type T.
2
new (buffer + ...) T(...);
Uses placement new to construct an object at a specific memory address.
3
reinterpret_cast<T*>(...)->~T();
Explicitly calls the destructor for manually constructed objects before the buffer is destroyed.