diff --git a/util/no_destructor.h b/util/no_destructor.h index c000379..3e09b75 100644 --- a/util/no_destructor.h +++ b/util/no_destructor.h @@ -10,6 +10,11 @@ namespace leveldb { +template +struct ObjectBuffer { + alignas(Alignment) unsigned char data_[Size]; +}; + // Wraps an instance whose destructor is never called. // // This is intended for use with function-level static variables. @@ -18,7 +23,12 @@ class NoDestructor { public: template explicit NoDestructor(ConstructorArgTypes&&... constructor_args) { - ::new (static_cast(instance_storage_)) + static_assert(sizeof(instance_storage_) >= sizeof(InstanceType), + "instance_storage_ is not large enough to hold the instance"); + static_assert( + alignof(decltype(instance_storage_)) >= alignof(InstanceType), + "instance_storage_ does not meet the instance's alignment requirement"); + ::new (static_cast(instance_storage_.data_)) InstanceType(std::forward(constructor_args)...); } @@ -28,11 +38,11 @@ class NoDestructor { NoDestructor& operator=(const NoDestructor&) = delete; InstanceType* get() { - return reinterpret_cast(+instance_storage_); + return reinterpret_cast(instance_storage_.data_); } private: - alignas(InstanceType) unsigned char instance_storage_[sizeof(InstanceType)]; + ObjectBuffer instance_storage_; }; } // namespace leveldb