読者です 読者をやめる 読者になる 読者になる

rust by exampleでsliceがどんなもんなのか気になったので(未解決)

Arrays and Slices | Rust by Example

をやったときのメモ。

ぱいそんのほうからやってきたのでポインタの知識が幼稚園児レベルです。以下デタラメを書き散らかしているのでご容赦。

Slices are similar to arrays, but their size is not known at compile time. Instead, a slice is a two-word object, the first word is a pointer to the data, and the second word is the length of the slice.

sliceはarrayに似ているが、それらの大きさはコンパイル時には分からない。代わりに、sliceは2 wordのオブジェクトからなる。最初のwordはデータへのポインタで、二つめのwordはスライスの長さである。

ここを読んで、ポインタとスライス長を持ってるオブジェクトとやらを見る方法はないんかね? と思った。

fn analyze_slice(slice: &[i32]) {
    /** 略 **/

    let addr_slice = &slice as *const _
    let addr_elem = &slice[0] as *const _;
    println!("address of the slice is: {:?}", addr_slice);
    println!("address of a first elem: {:?}", addr_elem);
    // address of the slice is: 0x7fff596a8d38
    // address of a first elem: 0x7fff596a9f8c

    /** 略 **/
}

関係ないが *const _ がポインタの型を表現しており、これにキャストするとポインタのhex値がもらえる、ということを学んだ。

sliceの中身を見るやり方としてイメージしていたのは、まず上のようにsliceのアドレスを得る、そのアドレスの位置から2 wordぶんメモリの値をunsafeにcopyする関数を使う。と考えていたのだが、リファレンスをみてもよーわからん。copyはあるんですが。見よう見まねで使っても、なんかコレジャナイ動きになってしまう。使い方が分かってない。

    let mut dst = Vec::with_capacity(2);
    unsafe {
        dst.set_len(2);

        ptr::copy(addr_slice, dst.as_mut_ptr(), 2);
    }
    println!("{:?}", dst);
    // [[1, 2, 3, 4, 5], /* ゴミデータ */]