-
Notifications
You must be signed in to change notification settings - Fork 14k
Description
It would be nice if the Read and Write implementations for std::io::Cursor were inlined. Consider this program:
use std::io::{Cursor,Write};
fn main() {
let mut arr = [0u8; 4];
let mut c = Cursor::new(&mut arr as &mut [u8]);
let _ = c.write(&[42, 7]);
let _ = c.write(&[127, 255]);
println!("{:?}", c.into_inner());
}If the write calls are inlined, then all the position computations are constant-folded and the writes compile to exactly what I'd hope for:
movl $0xff7f072a,0x5c(%rsp)I tested using rustc -C opt-level=2 -C lto, using rustc 1.10.0-nightly (e0fd34b 2016-05-09). I think that LTO is a pretty close approximation here to the effect that #[inline] would have, but I guess that assumption needs testing. (By the way: oddly, at opt-level=3 I got worse code.)
Without LTO, I get about 84 instructions for this sequence, counting the ones in main as well as the implementation of write itself.
That said, the Write implementation for Cursor<Vec<u8>> is more complicated and maybe shouldn't be inlined. But I think this request at least applies to the implementations for Cursor<&'a mut [u8]> and Cursor<Box<[u8]>>, and probably to the Read implementation for Cursor<T> where T: AsRef<[u8]>.
Does this sound sensible?