Size: a a a

2020 December 21

НТ

Никита Тыманович... in Rust Beginners
А от то, как оно работает "под капотом", мало кому нужно знать
источник

E

Eugene in Rust Beginners
разве те производители RiSC-V плат не могут внести такие изменения в архитектуру команд RISC-V, из-за которых перестанет работать то, что на rust написано для RISC-V?
источник

K

Kitsu in Rust Beginners
Никита Тыманович
Но так и в арме.
в арме ж и std вроде был, не?
источник

НТ

Никита Тыманович... in Rust Beginners
Eugene
разве те производители RiSC-V плат не могут внести такие изменения в архитектуру команд RISC-V, из-за которых перестанет работать то, что на rust написано для RISC-V?
Думаю, нет. Набор команд четко описан в стандарте. Нельзя просто так добавить от себя или убрать ненужное.
источник

НТ

Никита Тыманович... in Rust Beginners
Kitsu
в арме ж и std вроде был, не?
Я про кортекс М
источник

НТ

Никита Тыманович... in Rust Beginners
В бер метале стд нет ни у кого, насколько мне известно
источник

НТ

Никита Тыманович... in Rust Beginners
Конечно, можно запустить ОС. Там все будет
источник

K

Kitsu in Rust Beginners
а, ну на баре метал и не будет никогда стд
источник

НТ

Никита Тыманович... in Rust Beginners
Ну вот. Так-то да, для полного счастья не хватает tier 1 для риска. Но это вопрос времени
источник

НТ

Никита Тыманович... in Rust Beginners
Кстати, даже не уверен, что если на armv7 поставить линукс, будет работать стд
источник

K

Kitsu in Rust Beginners
Никита Тыманович
Кстати, даже не уверен, что если на armv7 поставить линукс, будет работать стд
источник

НТ

Никита Тыманович... in Rust Beginners
Ну,тогда все очень даже неплохо. В tier 2 рядышком и риск лежит
источник

NB

Nik Bond in Rust Beginners
Допустим у меня есть два типа A и B, с разными методами но идентичным представлением в памяти.
struct A { first: i64, second: i64}
struct B { first: u64, second: u64}

Ну и я реализовал трейт impl From<A> for B.

Некая функция возвращает Vec<A>. Я могу превратить его в Vec<B> с .into_iter().map(), но тогда произойдет переалокация буффера.
Как мне сделать это in-place, ведь у меня структуры одинаковые с точки зрения занимаемой памяти? Сделать какой-нибудь .for_each() я тоже не могу, ведь нужно вернуть значение другого типа чем там было
источник

NB

Nik Bond in Rust Beginners
Nik Bond
Допустим у меня есть два типа A и B, с разными методами но идентичным представлением в памяти.
struct A { first: i64, second: i64}
struct B { first: u64, second: u64}

Ну и я реализовал трейт impl From<A> for B.

Некая функция возвращает Vec<A>. Я могу превратить его в Vec<B> с .into_iter().map(), но тогда произойдет переалокация буффера.
Как мне сделать это in-place, ведь у меня структуры одинаковые с точки зрения занимаемой памяти? Сделать какой-нибудь .for_each() я тоже не могу, ведь нужно вернуть значение другого типа чем там было
п.с. Пусть оба будут #[repr(C)], если это важно
источник

NB

Nik Bond in Rust Beginners
Говорят, раньше в стд была map_in_place(), но ее давно депрекейтнули
источник

НТ

Никита Тыманович... in Rust Beginners
Попробуй взять указатель на первую структуру и привести его к указателю на вторую структуру)
источник

НТ

Никита Тыманович... in Rust Beginners
Хотя вопрос интересный, конечно
источник

Jøhn Đøꝩsøn in Rust Beginners
Nik Bond
Допустим у меня есть два типа A и B, с разными методами но идентичным представлением в памяти.
struct A { first: i64, second: i64}
struct B { first: u64, second: u64}

Ну и я реализовал трейт impl From<A> for B.

Некая функция возвращает Vec<A>. Я могу превратить его в Vec<B> с .into_iter().map(), но тогда произойдет переалокация буффера.
Как мне сделать это in-place, ведь у меня структуры одинаковые с точки зрения занимаемой памяти? Сделать какой-нибудь .for_each() я тоже не могу, ведь нужно вернуть значение другого типа чем там было
А ты точно уверен что реаллокация произойдёт если ты что нибудь в духе mem::transmute сделаешь?
источник

НТ

Никита Тыманович... in Rust Beginners
Да, всегда есть старина трансмют
источник

NB

Nik Bond in Rust Beginners
Jøhn Đøꝩsøn
А ты точно уверен что реаллокация произойдёт если ты что нибудь в духе mem::transmute сделаешь?
Уверен, что не произойдет. Тут тогда вопрос возникает в том как каждый i64 в u64 превратить
let file_ranges = unsafe {
       let mut tmp = std::mem::ManuallyDrop::new(vec_a);
       Vec::from_raw_parts(
           tmp.as_mut_ptr() as *mut B,
           tmp.len(),
           tmp.capacity())
   };


Ведь в таком варианте мусор будет
источник