diff options
| author | Stepan Koltsov <stepan.koltsov@gmail.com> | 2015-10-31 00:17:16 +0300 |
|---|---|---|
| committer | Stepan Koltsov <stepan.koltsov@gmail.com> | 2015-10-31 00:17:16 +0300 |
| commit | 46068c9dafe8cfa763ef855ec21f577a1e058de1 (patch) | |
| tree | 19f40fd28979ebc1dd77fde7599ab340ee1a8420 /src/libstd/sys/unix/stack_overflow.rs | |
| parent | 914c4dbc2a1037e63625b0bf846c6b550d0918c7 (diff) | |
| download | rust-46068c9dafe8cfa763ef855ec21f577a1e058de1.tar.gz rust-46068c9dafe8cfa763ef855ec21f577a1e058de1.zip | |
Fix excessive memory allocation in RawVec::reserve
Before this patch `reserve` function allocated twice as requested
amount elements (not twice as capacity). It leaded to unnecessary
excessive memory usage in scenarios like this:
```
let mut v = Vec::new();
v.push(17);
v.extend(0..10);
println!("{}", v.capacity());
```
`Vec` allocated 22 elements, while it could allocate just 11.
`reserve` function must have a property of keeping `push` operation
cost (which calls `reserve`) `O(1)`. To achieve this `reserve` must
exponentialy grow its capacity when it does reallocation.
There's better strategy to implement `reserve`:
```
let new_capacity = max(current_capacity * 2, requested_capacity);
```
This strategy still guarantees that capacity grows at `O(1)` with
`reserve`, and fixes the issue with `extend`.
Patch imlpements this strategy.
Diffstat (limited to 'src/libstd/sys/unix/stack_overflow.rs')
0 files changed, 0 insertions, 0 deletions
