about summary refs log tree commit diff
path: root/src/libstd/sys/unix/stack_overflow.rs
diff options
context:
space:
mode:
authorStepan Koltsov <stepan.koltsov@gmail.com>2015-10-31 00:17:16 +0300
committerStepan Koltsov <stepan.koltsov@gmail.com>2015-10-31 00:17:16 +0300
commit46068c9dafe8cfa763ef855ec21f577a1e058de1 (patch)
tree19f40fd28979ebc1dd77fde7599ab340ee1a8420 /src/libstd/sys/unix/stack_overflow.rs
parent914c4dbc2a1037e63625b0bf846c6b550d0918c7 (diff)
downloadrust-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