У меня есть цикл обработки, которому нужен указатель на большую таблицу поиска. Указатель, к сожалению, непрямо косвенен из исходных данных, поэтому сохранение этого указателя для внутреннего цикла имеет важное значение для производительности.Могу ли я восстановить заимствование локального в цикле?
Есть ли какой-либо способ, которым я могу сказать, что я "unborrowing" переменную состояния в маловероятном случае мне нужно изменить состояние ... поэтому я могу только повторно просмотреть срез в том случае, если срабатывает функция modify_state
?
Одно из решений, о которых я думал, заключалось в том, чтобы изменить данные как ссылку на срез и сделать mem::replace
в структуре в начале функции и вытащить фрагмент в локальную область, а затем заменить его обратно в конце функции - но это очень хрупкое и подверженное ошибкам (как мне нужно помнить, чтобы заменить элемент на каждый возврат). Есть ли другой способ сделать это?
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;
}
Можете ли вы просто передать '& mut state.lut_index' значение' modify_state'? –
Код о упрощении ... изменение состояния вызывает тонны помощников – hellcatv