More C++ Idioms/Fast Pimpl
Jump to navigation
Jump to search
This page or section is an undeveloped draft or outline. You can help to develop the work, or you can ask for assistance in the project room. |
Intent[edit | edit source]
Increase performance of Handle Body idiom.
Also Known As[edit | edit source]
Motivation[edit | edit source]
Regular PIMPL idiom achieves "Compilation Firewall" by sacrificing performance. Fast PIMPL attempts to reduce the overhead of heap allocation and non-local memory access by composing the implementation object within the original interface object.
Solution and Sample Code[edit | edit source]
// Wrapper.hpp
struct Wrapper {
Wrapper();
~Wrapper();
std::aligned_storage_t<32, alignof(std::max_align_t)> storage;
struct Wrapped; // forward declaration
Wrapped* handle;
};
// Wrapper.cpp
struct Wrapper::Wrapped {
};
Wrapper::Wrapper() {
static_assert(sizeof(Wrapped) <= sizeof(this->storage) , "Object can't fit into local storage");
this->handle = new (&this->storage) Wrapped();
}
Wrapper::~Wrapper() {
handle->~Wrapped();
}
Note that handle to instance of Wrapped class is not required. To reduce memory footprint Wrapped class can be accessed by a helper function instead .
static Wrapper::Wrapped* get_wrapped(Wrapper* wrapper) {
// c++17 compatible
return std::launder(reinterpret_cast<Wrapper::Wrapped*>(&wrapper->storage));
}
Known Uses[edit | edit source]
This pattern is frequently used in high performance or memory constrained environments when implementation is desired to be unseen or decoupled.
Related Idioms[edit | edit source]
- Handle Body (aka pimpl)