virtual_buffer: Add compile-time type-safety guarantees with VirtualBuffer

VirtualBuffer makes use of VirtualAlloc (on Windows) and mmap() (on
other platforms). Neither of these ensure that non-trivial objects are
properly constructed in the allocated memory.

To prevent potential undefined behavior occurring due to that, we can
add a static assert to loudly complain about cases where that is done.
merge-requests/60/head
Lioncash 2020-11-17 20:09:55 +07:00
parent b3c8997829
commit 0ca91ced2d
1 changed files with 6 additions and 0 deletions

@ -4,6 +4,7 @@
#pragma once #pragma once
#include <type_traits>
#include <utility> #include <utility>
namespace Common { namespace Common {
@ -14,6 +15,11 @@ void FreeMemoryPages(void* base, std::size_t size) noexcept;
template <typename T> template <typename T>
class VirtualBuffer final { class VirtualBuffer final {
public: public:
static_assert(
std::is_trivially_constructible_v<T>,
"T must be trivially constructible, as non-trivial constructors will not be executed "
"with the current allocator");
constexpr VirtualBuffer() = default; constexpr VirtualBuffer() = default;
explicit VirtualBuffer(std::size_t count) : alloc_size{count * sizeof(T)} { explicit VirtualBuffer(std::size_t count) : alloc_size{count * sizeof(T)} {
base_ptr = reinterpret_cast<T*>(AllocateMemoryPages(alloc_size)); base_ptr = reinterpret_cast<T*>(AllocateMemoryPages(alloc_size));