大きなルックアップ テーブルへのポインタを必要とする処理ループがあります。残念なことに、ポインタはソース データから 3 重に間接化されているため、内部ループのためにそのポインタを維持することがパフォーマンスにとって不可欠です。
万一状態を変更する必要がある場合に状態変数を「借用解除」していることを借用チェッカーに伝える方法はありmodify_state
ますか?関数がトリガーされた場合にのみスライスを再検索できますか?
私が考えた 1 つの解決策は、データをスライス参照に変更しmem::replace
、関数の先頭で構造体に対して a を実行し、スライスをローカル スコープにプルしてから、関数の最後で元に戻すことでしたが、これは非常に脆弱です。エラーが発生しやすい(返品のたびにアイテムを交換することを覚えておく必要があるため). これを達成する別の方法はありますか?
struct DoubleIndirect {
data: [u8; 512 * 512],
lut: [usize; 16384],
lut_index: usize,
}
#[cold]
fn modify_state(s: &mut DoubleIndirect) {
s.lut_index += 63;
s.lut_index %= 16384;
}
fn process(state: &mut DoubleIndirect) -> [u8; 65536] {
let mut ret: [u8; 65536] = [0; 65536];
let mut count = 0;
let mut data_slice = &state.data[state.lut[state.lut_index]..];
for ret_item in ret.iter_mut() {
*ret_item = data_slice[count];
if count % 197 == 196 {
data_slice = &[];
modify_state(state);
data_slice = &state.data[state.lut[state.lut_index]..];
}
count += 1
}
return ret;
}