reserve and capacity not matching #18

reserve(), especially for parallel_*_hash_*, was reserving excessive sizes. Now the size is closer to the one requested, even though the "power-of-two" capacity requirement still creates a capacity() greater than what is asked in reserve().
This commit is contained in:
greg
2019-07-25 20:43:58 -04:00
parent 82f48422c0
commit 1aeeff1b65
+7 -2
View File
@@ -1541,7 +1541,7 @@ public:
}
// bitor is a faster way of doing `max` here. We will round up to the next
// power-of-2-minus-1, so bitor is good enough.
auto m = NormalizeCapacity(n | GrowthToLowerboundCapacity(size()));
auto m = NormalizeCapacity(std::max(n, size()));
// n == 0 unconditionally rehashes as per the standard.
if (n == 0 || m > capacity_) {
resize(m);
@@ -3008,7 +3008,12 @@ public:
}
}
void reserve(size_t n) { rehash(GrowthToLowerboundCapacity(n)); }
void reserve(size_t n)
{
size_t target = GrowthToLowerboundCapacity(n);
size_t normalized = 16 * NormalizeCapacity(n / num_tables);
rehash(normalized > target ? normalized : target);
}
// Extension API: support for heterogeneous keys.
//