list_passed_as_fat_pointer.rs

Code

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