質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Rust

Rustは、MoFoが支援するプログラミング言語。高速性を維持しつつも、メモリ管理を安全に行うことが可能な言語です。同じコンパイル言語であるC言語やC++では困難だったマルチスレッドを実装しやすく、並行性という点においても優れています。

Q&A

解決済

1回答

472閲覧

transmute使用時のArrayの参照のサイズ

namuyan

総合スコア76

Rust

Rustは、MoFoが支援するプログラミング言語。高速性を維持しつつも、メモリ管理を安全に行うことが可能な言語です。同じコンパイル言語であるC言語やC++では困難だったマルチスレッドを実装しやすく、並行性という点においても優れています。

0グッド

0クリップ

投稿2019/02/28 16:23

編集2019/03/01 01:39

Rustのチュートリアルを終えて一週間が経過しようとしています。
transmuteを使用した例が存在しますが動作に理解できない事があります。
例を下記の様に変更しました。

rust

1use std::mem::transmute; 2 3fn main() { 4 let a: [u8;4] = [34, 1, 0, 0]; 5 unsafe { 6 let b = transmute::<&[u8; 4], u32>(&a); 7 } 8 println!("{:?}", a); 9}

すると下記のようなエラーが出力されます。
何故Arrayが参照になると64bitになるのかわかりません。

error

1error[E0512]: cannot transmute between types of different sizes, or dependently-sized types 2 --> src/main.rs:7:17 3 | 47 | let b = transmute::<&[u8; 4], u32>(&a); 5 | ^^^^^^^^^^^^^^^^^^^^^^^^^^ 6 | 7 = note: source type: `&[u8; 4]` (64 bits) 8 = note: target type: `u32` (32 bits)

なにか分かる方は回答の方を宜しくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

参照(&)はポインタの一種で、その値は、それが指しているデータのメモリ上のアドレスです。アドレスは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が置かれているアドレスを持っていることが確認できます。

投稿2019/02/28 22:52

編集2019/03/01 00:07
tatsuya6502

総合スコア2035

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問