use std::mem;
// `list` is a fat pointer: two words on the stack — (data_ptr, length)
fn largest(list: &[i32]) -> &i32 {
println!("size of &[i32] fat pointer : {} bytes", mem::size_of::<&[i32]>());
println!("size of &i32 thin pointer : {} bytes", mem::size_of::<&i32>());
println!();
// Decompose the fat pointer into its two machine words
let (data_ptr, len): (*const i32, usize) = unsafe { mem::transmute(list) };
println!("word 1 — data pointer : {:p}", data_ptr);
println!("word 2 — length : {}", len);
println!();
let mut largest = &list[0];
for item in list {
if item > largest {
largest = item;
}
}
largest
}
fn main() {
let numbers = vec![34, 50, 25, 100, 65];
println!("numbers = {:?}", numbers);
println!();
println!("largest = {}", largest(&numbers));
}
Output
numbers = [34, 50, 25, 100, 65]
size of &[i32] fat pointer : 16 bytes
size of &i32 thin pointer : 8 bytes
word 1 — data pointer : 0x600001fe5200
word 2 — length : 5
largest = 100