You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Consider `HashSet<u8>` on x86_64 with SSE:
| buckets | capacity | allocated bytes |
| ------- | -------- | --------------- |
| 4 | 3 | 36 |
| 8 | 7 | 40 |
| 16 | 14 | 48 |
Quadroupling the number of buckets from 4 to 16 does not even increase
the final allocation size by 50% (48/36=1.333). This is an edge case
due to the padding of the control bytes.
This platform isn't the only one with edges. Here's aarch64 on an M1
for the same `HashSet<u8>`:
| buckets | capacity | allocated bytes |
| ------- | -------- | --------------- |
| 4 | 3 | 20 |
| 8 | 7 | 24 |
| 16 | 14 | 40 |
Notice 4 -> 8 buckets leading to only 4 more bytes (20 -> 24) instead
of roughly doubling.
Generalized, `buckets * table_layout.size` needs to be at least as big
as `table_layout.ctrl_align`. For the cases I listed above, we'd get
these new minimum bucket sizes:
- x86_64 with SSE: 16
- aarch64: 8
This is a niche optimization. However, it also removes possible
undefined behavior edge case in resize operations. In addition, it
may be a useful property to utilize over-sized allocations (see
rust-lang#523).
0 commit comments