前提
Rust で配列を返す関数を実装したいのですが、巨大な配列を扱うので、メモリ節約とパフォーマンス向上のために、なるべく新しいインスタンスを作らないような実装をしたいです。そのための知恵をお貸しください。
実現したいこと
例えば、次の 2 パターンのアルゴリズムを実現する関数を実装したいです。計算内容は簡略化しています。
- ある配列
x: [f64; 100]
の各成分に1.0
を足したもの返し、自分自身に代入する。 - ある配列
x: [f64; 100]
の前半 50 成分と後半 50 成分を足した配列[f64; 50]
を構成し、それを既に定義されているインスタンスy: [f64; 50]
に代入する。
このとき、関数の外側で既に生成されているインスタンス以外に、余分な関数内インスタンス(自動変数)を生成しないようにしたいです。
試したこと
個人的にいちばん素朴な実装方法は、配列 x
を &mut
で渡し、引数を通じて返す方法です。
Rust
1// パターン 1 の関数 2fn func1(x: &mut [f64; 100]) { 3 for i in 0..100 { 4 x[i] = x[i] + 1.0; 5 } 6} 7// パターン 2 の関数 8fn func2(x: &[f64; 100], y: &mut [f64; 50]) { 9 for i in 0..50 { 10 y[i] = x[i] + x[50+i]; 11 } 12} 13// 関数を呼び出すプログラム 14fn main() { 15 let mut x = [0.0; 100]; 16 let mut y = [0.0; 50]; 17 func1(&mut x); 18 func2(&x, &mut y); 19 println!("{}, {}", x[0], y[0]); 20}
こうすれば、main()
で生成されたインスタンス x, y
以外に配列が生成されることは無いと思います。しかし、引数ではなく、戻り値として計算結果を返すような関数として実装したい場合はどうすれば良いでしょうか?
関数内で let
をしたり、引数を値渡しにすると、自動変数が生成されてしまいますよね?
お聞きしたいこと
上で述べた方法でも十分なのですが、例えば
Rust
1y = func2(&x);
というように、関数の返す結果をイコールの左側に置くような方法で記述できたならば、コードが見やすくなるかもしれないと思い、そのような実装が Rust の独特な文法を用いて可能なのかどうかを質問しました。不可能であれば、その旨をお知らせいただけると助かります。
ご回答お待ちしています。
回答1件
あなたの回答
tips
プレビュー