heap - How can you allocate a raw mutable pointer in stable Rust? -
i trying build naive implementation of custom string
-like struct small string optimization. unions allowed in stable rust, came following code:
struct large { capacity: usize, buffer: *mut u8, } struct small([u8; 16]); union container { large: large, small: small, } struct mystring { len: usize, container: container, }
i can't seem find way how allocate *mut u8
. possible in stable rust? looks using alloc::heap
work, available in nightly.
if you'd allocate collection of u8
instead of single u8
, can create vec
, convert constituent pieces, such calling as_mut_ptr
:
use std::mem; fn main() { let mut foo = vec![0; 1024]; // or vec::<u8>::with_capacity(1024); let ptr = foo.as_mut_ptr(); let cap = foo.capacity(); let len = foo.len(); mem::forget(foo); // avoid calling destructor! let foo_again = unsafe { vec::from_raw_parts(ptr, len, cap) }; // rebuild drop // *not* use `ptr` / `cap` / `len` anymore }
re allocating bit of pain though; you'd have convert vec
, whole dance forwards , backwards
that being said, see it's bit in hierarchy.large
struct seems missing length
, distinct capacity. use vec
instead of writing out.
i wonder if having full string
wouldn't lot easier, if bit less efficient in length double-counted...
union container { large: string, small: small, }
see also:
Comments
Post a Comment