aboutsummaryrefslogtreecommitdiffstats
path: root/chilbert
diff options
context:
space:
mode:
authorDavid Robillard <d@drobilla.net>2018-08-11 19:50:27 +0200
committerDavid Robillard <d@drobilla.net>2018-09-29 14:46:23 +0200
commitdf0d52f4bd78c2197a88a805a1dd402978df3290 (patch)
tree503379fbabb3a7f2b50c57898a4fbf6fa0e49d09 /chilbert
parent26b80e46866fe90bdf41ee966499af9d49123f92 (diff)
downloadchilbert-df0d52f4bd78c2197a88a805a1dd402978df3290.tar.gz
chilbert-df0d52f4bd78c2197a88a805a1dd402978df3290.tar.bz2
chilbert-df0d52f4bd78c2197a88a805a1dd402978df3290.zip
Use calloc to ensure racks are zero initialized with low overhead
Diffstat (limited to 'chilbert')
-rw-r--r--chilbert/BigBitVec.hpp29
1 files changed, 21 insertions, 8 deletions
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 <algorithm>
#include <cassert>
+#include <cstdlib>
#include <cstring>
#include <memory>
@@ -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<FBV_UINT[]>{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<FBV_UINT[]>{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<FBV_UINT[]>{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<FBV_UINT[], RacksDeleter>;
+
+ static RacksPtr make_racks(const int n)
+ {
+ return RacksPtr{static_cast<FBV_UINT*>(calloc(n, sizeof(FBV_UINT)))};
+ }
+
// Right rotates entire racks (in place).
void rackRotr(int k)
{
@@ -491,8 +504,8 @@ private:
}
}
- std::unique_ptr<FBV_UINT[]> m_pcRacks;
- int m_iRacks;
+ RacksPtr m_pcRacks;
+ int m_iRacks;
};
template <>