Skip to main content

size_of_val_raw

Function size_of_val_raw 

1.99.0 (const: 1.99.0) · Source
pub const unsafe fn size_of_val_raw<T>(val: *const T) -> usize
where T: ?Sized,
Expand description

Returns the size of the pointed-to value in bytes.

This is usually the same as size_of::<T>(). However, when T has no statically-known size, e.g., a slice [T] or a trait object, then size_of_val_raw can be used to get the dynamically-known size.

§Safety

This function is safe to call if the pointer is safe to reborrow as &T (in which case you could also call size_of_val). Otherwise, the following conditions must hold:

  • If T is Sized, this function is always safe to call.
  • If the unsized tail of T is:
    • a slice [U], str, or a trait object dyn Trait, then the size of the entire value (dynamic tail length + statically sized prefix) must fit in isize. For the special case where the dynamic tail length is 0, this function is safe to call.
    • No other kind of unsized tail currently exists that satisfies the trait bounds for this function. If more kinds of unsized tails get introduced in the future, the documentation of this function will have to be extended before it can be used for such types.

Here, unsized tail refers to the type obtained by recursively descending through the last field of a tuple or struct until we arrived at a built-in unsized type.

As a consequence of these rules, it is the case that whenever it is allowed to convert val into a shared reference, then it is also allowed to invoke this function.

§Examples

use std::mem;

assert_eq!(4, size_of_val(&5i32));

let x: [u8; 13] = [0; 13];
let y: &[u8] = &x;
assert_eq!(13, unsafe { mem::size_of_val_raw(y) });