Size: a a a

Rust — русскоговорящее сообществo

2020 December 09

KK

Kirill (Cykooz) Kuzm... in Rust — русскоговорящее сообществo
Apachee
а как ты получаешь буффер вектора? into_raw_parts забирает владение вектором и отдает память тебе под контроль, например
let capacity = values.capacity();
let ptr = values.as_mut_ptr();
источник

A

Adv0cat in Rust — русскоговорящее сообществo
Kirill (Cykooz) Kuzminykh
А как дропнуть вектор, что бы не вызывать деаллокацию занятую его буффером память (я её к этому моменту в другой вектор засунул через Vec::from_raw_parts())?
Я так чисто по ламерски, но может Vec<Option<T>> при занулвании значений оставит прежнюю память?)
источник

в🧇

вафель 🧇 in Rust — русскоговорящее сообществo
Kirill (Cykooz) Kuzminykh
Я этот способ подглядел в нестабильном методе вектора into_raw_parts()
а, он не стабильный... тогда просто копипасть его
источник

a

antuan in Rust — русскоговорящее сообществo
https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=e5c63b5515da3889368af4cbb6d5fe19
получаю такую ошибку:
23  |           match files::table
   |  _______________^
24  | |             .filter(files::remote_id.eq(remote_id.clone()))
25  | |             .get_results(db_pool)
   | |__________________^ pattern `Ok(_)` not covered


я чего-то не вижу? или компилятор недостаточно умен? если второй вариант - можно ли это считать багом в компиляторе?
источник

A

Apachee in Rust — русскоговорящее сообществo
Kirill (Cykooz) Kuzminykh
let capacity = values.capacity();
let ptr = values.as_mut_ptr();
а зачем так, когда есть into_raw_parts, который получает эти значения и дропает вектор
источник

в🧇

вафель 🧇 in Rust — русскоговорящее сообществo
Kirill (Cykooz) Kuzminykh
Вот это мне поможет ManuallyDrop::new(vec)?
это даже в примерах from_raw_parts есть
источник

KK

Kirill (Cykooz) Kuzm... in Rust — русскоговорящее сообществo
Apachee
а зачем так, когда есть into_raw_parts, который получает эти значения и дропает вектор
Он не стабильный и мне не надо его сразу дропать. Мне надо из него последовательно считать значения сконвертить их в другой тип и запихнуть в тот новый вектор, который я создал на основе буфера первого. Т.е. мне надо сконвертить Vec<f64>  в Vec<i32> не выделяя новой памяти.
источник

в🧇

вафель 🧇 in Rust — русскоговорящее сообществo
Kirill (Cykooz) Kuzminykh
Он не стабильный и мне не надо его сразу дропать. Мне надо из него последовательно считать значения сконвертить их в другой тип и запихнуть в тот новый вектор, который я создал на основе буфера первого. Т.е. мне надо сконвертить Vec<f64>  в Vec<i32> не выделяя новой памяти.
2 вектора с одним буфером ты использовать одновременно не можешь, если что
источник

A

Apachee in Rust — русскоговорящее сообществo
Kirill (Cykooz) Kuzminykh
Он не стабильный и мне не надо его сразу дропать. Мне надо из него последовательно считать значения сконвертить их в другой тип и запихнуть в тот новый вектор, который я создал на основе буфера первого. Т.е. мне надо сконвертить Vec<f64>  в Vec<i32> не выделяя новой памяти.
ну тогда да, ManuallyDrop
источник

KK

Kirill (Cykooz) Kuzm... in Rust — русскоговорящее сообществo
вафель 🧇
2 вектора с одним буфером ты использовать одновременно не можешь, если что
Почему же не могу - вроде всё нормально заработало. И да, пришлось заюзать unsafe, что бы создать новый вектор из указателя на буфер первого вектора.
источник

D

Denis in Rust — русскоговорящее сообществo
ну у тебя же один вектор в итоге получается
источник

в🧇

вафель 🧇 in Rust — русскоговорящее сообществo
Kirill (Cykooz) Kuzminykh
Почему же не могу - вроде всё нормально заработало. И да, пришлось заюзать unsafe, что бы создать новый вектор из указателя на буфер первого вектора.
Ну как что, UB у тебя)
источник

в🧇

вафель 🧇 in Rust — русскоговорящее сообществo
2 уникальных указателя на одну память
источник

p

polunin.ai in Rust — русскоговорящее сообществo
Kirill (Cykooz) Kuzminykh
Он не стабильный и мне не надо его сразу дропать. Мне надо из него последовательно считать значения сконвертить их в другой тип и запихнуть в тот новый вектор, который я создал на основе буфера первого. Т.е. мне надо сконвертить Vec<f64>  в Vec<i32> не выделяя новой памяти.
из той же памяти создавать вектор с другим типом - а не УБ ли это :))
тут всякие моменты с align, освобождением памяти, размером границ встают.
источник

KK

Kirill (Cykooz) Kuzm... in Rust — русскоговорящее сообществo
вафель 🧇
Ну как что, UB у тебя)
С чего бы? i32 в два раза меньше чем f64. Я в цикле читаю последовательно все f64, и потом в этот же буфер записываю i32. i32 никогда не догонят f64.
источник

p

polunin.ai in Rust — русскоговорящее сообществo
вафель 🧇
2 уникальных указателя на одну память
дык у вектора не Unique<T> вроде
источник

в🧇

вафель 🧇 in Rust — русскоговорящее сообществo
polunin.ai
дык у вектора не Unique<T> вроде
Unique
источник

в🧇

вафель 🧇 in Rust — русскоговорящее сообществo
Kirill (Cykooz) Kuzminykh
С чего бы? i32 в два раза меньше чем f64. Я в цикле читаю последовательно все f64, и потом в этот же буфер записываю i32. i32 никогда не догонят f64.
У тебя 2 вектора существуют одновременно?
источник

KK

Kirill (Cykooz) Kuzm... in Rust — русскоговорящее сообществo
Разве что я не уверен что capacity для Vec<i32> будет всегда в два раза больше чем capacity для Vec<f64>
источник

D

Denis in Rust — русскоговорящее сообществo
подождите, так один вектор "преобразуется" в другой, или всё-таки остаются и старый, и новый, указывающий на ту же область памяти, что и старый?
источник