1

大きなルックアップ テーブルへのポインタを必要とする処理ループがあります。残念なことに、ポインタはソース データから 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;
}
4

1 に答える 1

3

これを行う最も簡単な方法は、 の借用stateがすべてばらばらであることを確認することです。

#[cold]
fn modify_state(lut_index: &mut usize) {
    *lut_index += 63;
    *lut_index %= 16384;
}

fn process(state: &mut DoubleIndirect) -> [u8; 65536] {
    let mut ret: [u8; 65536] = [0; 65536];
    let mut count = 0;
    let mut lut_index = &mut state.lut_index;
    let mut data_slice = &state.data[state.lut[*lut_index]..];
    for ret_item in ret.iter_mut() {
        *ret_item = data_slice[count];
        if count % 197 == 196 {
            modify_state(lut_index);
            data_slice = &state.data[state.lut[*lut_index]..];
        }
        count += 1
    }
    return ret;
}

問題は基本的に 2 つのことです: 第一に、Rust関数のシグネチャを超えてそれが何をするかを調べません。コンパイラが知る限り、への呼び出しmodify_stateも変更state.dataされる可能性があり、それを許可することはできません。

2 番目の問題は、借用が語彙的であることです。コンパイラは、借用使用される可能性のあるコードのブロックを調べます。借用が実際にアクティブな場所に一致するように借用の長さを短縮しようとすることは (現在のところ) 面倒ではありません。

たとえば、を使用してローカル変数にstd::mem::replaceプルアウトし、作業を行ってから、戻る直前に戻ってゲームをプレイすることもできます。state.datareplace

于 2016-04-16T18:25:37.910 に答える