参照(&
)はポインタの一種で、その値は、それが指しているデータのメモリ上のアドレスです。アドレスは64ビットOSでは8バイトですので、参照の値のサイズも8バイトになります。
簡単なプログラムを作ってみました。
rust
1use std::mem::{size_of, transmute};
2
3fn main() {
4 let a = [34, 1, 0, 0]; // [u8; 4]型
5 let a_ref = &a; // &[u8; 4]型
6
7 let b = 12u32; // u32型
8 let b_ref = &b; // &u32型
9
10 println!("var size address value");
11 println!("--------------- ---- -------------- ---------------");
12
13 println!(
14 "a: [u8; 4] {} {:p} {:?}",
15 size_of::<[u8; 4]>(),
16 &a,
17 a
18 );
19 println!(
20 "a_ref: &[u8; 4] {} {:p} 0x{:x}",
21 size_of::<&[u8; 4]>(),
22 &a_ref,
23 ref2usize(a_ref)
24 );
25 println!(
26 "b: u32 {} {:p} {:?}",
27 size_of::<u32>(),
28 &b,
29 b
30 );
31 println!(
32 "b_ref: &u32 {} {:p} 0x{:x}",
33 size_of::<&u32>(),
34 &b_ref,
35 ref2usize(b_ref)
36 );
37}
38
39fn ref2usize<T>(r: &T) -> usize {
40 unsafe { transmute(r) }
41}
このプログラムは4つの異なる型の値をつくり、それぞれについて以下の情報を表示します。
- その型の値のデータサイズ(単位:バイト)
- その値が置かれているメモリ上のアドレス
- その値の内容
実行結果は、たとえば以下のようになります。ただしメモリ上のアドレス(address)は実行するたびに違った結果となります。
console
1var size address value
2--------------- ---- -------------- ---------------
3a: [u8; 4] 4 0x7ffeedd64b88 [34, 1, 0, 0]
4a_ref: &[u8; 4] 8 0x7ffeedd64b98 0x7ffeedd64b88
5b: u32 4 0x7ffeedd64ba4 12
6b_ref: &u32 8 0x7ffeedd64ba8 0x7ffeedd64ba4
参照a_ref
はそのサイズは8バイト(64ビット)で、値としてa
が置かれているアドレスを持っていることが確認できます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。