From df0d52f4bd78c2197a88a805a1dd402978df3290 Mon Sep 17 00:00:00 2001 From: David Robillard Date: Sat, 11 Aug 2018 19:50:27 +0200 Subject: Use calloc to ensure racks are zero initialized with low overhead --- chilbert/BigBitVec.hpp | 29 +++++++++++++++++++++-------- 1 file changed, 21 insertions(+), 8 deletions(-) (limited to 'chilbert') diff --git a/chilbert/BigBitVec.hpp b/chilbert/BigBitVec.hpp index 79c8151..8b315a0 100644 --- a/chilbert/BigBitVec.hpp +++ b/chilbert/BigBitVec.hpp @@ -23,6 +23,7 @@ #include #include +#include #include #include @@ -40,13 +41,13 @@ class CBigBitVec { public: CBigBitVec(const int bits = 0) - : m_pcRacks{new FBV_UINT[bits == 0 ? 0 : FBVS_NEEDED(bits)]} + : m_pcRacks{make_racks(FBVS_NEEDED(bits))} , m_iRacks{bits == 0 ? 0 : FBVS_NEEDED(bits)} { } CBigBitVec(const CBigBitVec& vec) - : m_pcRacks{new FBV_UINT[vec.m_iRacks]} + : m_pcRacks{make_racks(vec.m_iRacks)} , m_iRacks{vec.m_iRacks} { if (vec.m_pcRacks) { @@ -59,7 +60,7 @@ public: CBigBitVec(CBigBitVec&& vec) = default; CBigBitVec(const CFixBitVec& vec) - : m_pcRacks{new FBV_UINT[1]} + : m_pcRacks{make_racks(1)} , m_iRacks{1} { m_pcRacks[0] = vec.rack(); @@ -116,7 +117,7 @@ public: { if (m_iRacks < vec.m_iRacks) { m_iRacks = vec.m_iRacks; - m_pcRacks = std::unique_ptr{new FBV_UINT[m_iRacks]}; + m_pcRacks = make_racks(m_iRacks); memcpy(m_pcRacks.get(), vec.m_pcRacks.get(), sizeof(CFixBitVec) * m_iRacks); @@ -138,7 +139,7 @@ public: CBigBitVec& operator=(const CFixBitVec& vec) { if (!m_pcRacks) { - m_pcRacks = std::unique_ptr{new FBV_UINT[1]}; + m_pcRacks = make_racks(1); } m_iRacks = 1; @@ -149,7 +150,7 @@ public: CBigBitVec& operator=(const FBV_UINT j) { if (!m_pcRacks) { - m_pcRacks = std::unique_ptr{new FBV_UINT[1]}; + m_pcRacks = make_racks(1); } m_iRacks = 1; @@ -464,6 +465,18 @@ private: int bit; }; + struct RacksDeleter + { + void operator()(FBV_UINT* const racks) { free(racks); } + }; + + using RacksPtr = std::unique_ptr; + + static RacksPtr make_racks(const int n) + { + return RacksPtr{static_cast(calloc(n, sizeof(FBV_UINT)))}; + } + // Right rotates entire racks (in place). void rackRotr(int k) { @@ -491,8 +504,8 @@ private: } } - std::unique_ptr m_pcRacks; - int m_iRacks; + RacksPtr m_pcRacks; + int m_iRacks; }; template <> -- cgit v1.2.1