The JavaString uses short string optimizations and a lack of a "capacity" field to reduce struct size and heap fragmentation in certain cases.
- Supports String API (very little at the moment but steadily growing)
- Smaller size than standard string (16 vs 24 bytes on 64-bit platforms)
- String interning for up to 15 bytes on 64-bit architectures (or 7 bytes on 32-bit)
Here's how it works:
- We store
len, the length of the string, and
data, the pointer to the string itself.
- We maintain the invariant that
datais a valid pointer if and only if it points to something that's aligned to 2 bytes.
- Now, any time we wanna read the string, we first check the lowest significance
data, and use that to see whether or not to dereference it.
dataonly uses one bit for its flag, we can use the entire lower order byte for length information when it's interned. We do this with a bitshift right.
- When interning, we have
std::mem::size_of::<usize>() * 2 - 1bytes of space. On x64, this is 15 bytes, and on 32-bit architectures, this is 7 bytes.
JavaString uses short string optimizations and a lack of a "capacity" field to reduce struct size and heap fragmentation in certain cases.