From d3657687c9b84d2ea2ea39b2fac7b89597bde848 Mon Sep 17 00:00:00 2001 From: Kenneth Heafield Date: Wed, 31 Mar 2021 23:28:07 +0100 Subject: Move sematics for AlignedVector --- intgemm/aligned.h | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/intgemm/aligned.h b/intgemm/aligned.h index 7500a8c..6fda369 100644 --- a/intgemm/aligned.h +++ b/intgemm/aligned.h @@ -5,24 +5,39 @@ #include #endif -// 64-byte aligned simple vector. +// Aligned simple vector. namespace intgemm { template class AlignedVector { public: - explicit AlignedVector(std::size_t size) + AlignedVector() : mem_(nullptr), size_(0) {} + + explicit AlignedVector(std::size_t size, std::size_t alignment = 64 /* CPU cares about this */) : size_(size) { #ifdef _MSC_VER - mem_ = static_cast(_aligned_malloc(size * sizeof(T), 64)); + mem_ = static_cast(_aligned_malloc(size * sizeof(T), alignment)); if (!mem_) throw std::bad_alloc(); #else - if (posix_memalign(reinterpret_cast(&mem_), 64, size * sizeof(T))) { + if (posix_memalign(reinterpret_cast(&mem_), alignment, size * sizeof(T))) { throw std::bad_alloc(); } #endif } + AlignedVector(AlignedVector &&from) : mem_(from.mem_), size_(from.size_) { + from.mem_ = nullptr; + from.size_ = 0; + } + + AlignedVector &operator=(AlignedVector &&from) { + mem_ = from.mem_; + size_ = from.size_; + from.mem_ = nullptr; + from.size_ = 0; + return *this; + } + AlignedVector(const AlignedVector&) = delete; AlignedVector& operator=(const AlignedVector&) = delete; -- cgit v1.2.3