Open
Description
Rebinding a value within an async function can cause the generated future to require twice the memory for the value. This seems to only happen if the value was borrowed earlier:
use std::mem;
async fn foo() {
let x = [0u8; 100];
async {}.await;
println!("{}", x.len());
}
async fn a() {
let fut = foo();
let fut = fut;
fut.await;
}
async fn b() {
let fut = foo();
println!("{}", mem::size_of_val(&fut));
let fut = fut;
fut.await;
}
fn main() {
assert_eq!(mem::size_of_val(&foo()), 102);
// 1 + sizeof(foo)
assert_eq!(mem::size_of_val(&a()), 103);
// 1 + (sizeof(foo) * 2)
assert_eq!(mem::size_of_val(&b()), 205);
}
I don't know if this counts as a bug but the behavior is a bit surprising.
The effect is present in both debug and release modes with rustc 1.60.0.
Metadata
Metadata
Assignees
Labels
Type
Projects
Status
On deck