Size: a a a

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

2020 September 30

в🧇

вафель 🧇 in Rust — русскоговорящее сообществo
Эрик
Почему ты не хочешь просто vec.iter_mut().filter_map(Option::as_mut)?
Потому что потом вектор забьётся None'ами. Моё решение как минимум более стабильное
источник

Э

Эрик in Rust — русскоговорящее сообществo
И кода меньше писать придётся.
источник

Э

Эрик in Rust — русскоговорящее сообществo
Эрик
Только

if self.none_count > self.vec.len() / 2 { self.vec.retain(Option::is_some); self.none_count = 0; }
Не забьётся.
источник

в🧇

вафель 🧇 in Rust — русскоговорящее сообществo
Эрик
Не забьётся.
Ну тогда его чистить придётся :)

Какая разница?
источник

Э

Эрик in Rust — русскоговорящее сообществo
вафель 🧇
Ну тогда его чистить придётся :)

Какая разница?
Кода меньше. То, что ты хочешь писать, надо писать с ансейфом.
источник

в🧇

вафель 🧇 in Rust — русскоговорящее сообществo
Эрик
Кода меньше. То, что ты хочешь писать, надо писать с ансейфом.
Вот это внезапно, чтобы ты и против ансейва был)
источник

Э

Эрик in Rust — русскоговорящее сообществo
вафель 🧇
Вот это внезапно, чтобы ты и против ансейва был)
Мне пришлось научиться писать ансейф, но это вовсе не значит, что я люблю его писать.
источник

Э

Эрик in Rust — русскоговорящее сообществo
unsafe — это всегда головная боль. Вот, скажем, есть у тебя &[u64] слайса. Сможешь без UB кастануть её в &[u8]?
источник

EG

Emmanuel Goldstein in Rust — русскоговорящее сообществo
Эрик
unsafe — это всегда головная боль. Вот, скажем, есть у тебя &[u64] слайса. Сможешь без UB кастануть её в &[u8]?
Почему нет?
Alignment у u64 более строгий, все значения конкретных байтов u64 корректны для u8, количество байтов всегда целое, длину можно легко посчитать, что я упускаю?
источник

Э

Эрик in Rust — русскоговорящее сообществo
Emmanuel Goldstein
Почему нет?
Alignment у u64 более строгий, все значения конкретных байтов u64 корректны для u8, количество байтов всегда целое, длину можно легко посчитать, что я упускаю?
Код можн?
источник

в🧇

вафель 🧇 in Rust — русскоговорящее сообществo
Эрик
unsafe — это всегда головная боль. Вот, скажем, есть у тебя &[u64] слайса. Сможешь без UB кастануть её в &[u8]?
align_to и вперёд? Ну или slice::from_raw_parts + as *const _
источник

A

Aragaer in Rust — русскоговорящее сообществo
Emmanuel Goldstein
Почему нет?
Alignment у u64 более строгий, все значения конкретных байтов u64 корректны для u8, количество байтов всегда целое, длину можно легко посчитать, что я упускаю?
а вот порядок этих байт может быть разным
источник

EG

Emmanuel Goldstein in Rust — русскоговорящее сообществo
Aragaer
а вот порядок этих байт может быть разным
А это порождает UB? Каким образом? Результат может получиться разным, но он будет разным конкретным определённым способом.
источник

A

Aragaer in Rust — русскоговорящее сообществo
а на архитектурах, где байты не 8 бит (существуют такие, где 16) уже может быть и не так хорошо
источник

в🧇

вафель 🧇 in Rust — русскоговорящее сообществo
Aragaer
а на архитектурах, где байты не 8 бит (существуют такие, где 16) уже может быть и не так хорошо
u8 всегда 8 бит, на это все опираются
источник

EG

Emmanuel Goldstein in Rust — русскоговорящее сообществo
Aragaer
а на архитектурах, где байты не 8 бит (существуют такие, где 16) уже может быть и не так хорошо
Байты могут быть сколько угодно бит, а в u8 бит 8
источник

A

Aragaer in Rust — русскоговорящее сообществo
да, но не любые 8 бит адресуемы
источник

Э

Эрик in Rust — русскоговорящее сообществo
вафель 🧇
align_to и вперёд? Ну или slice::from_raw_parts + as *const _
Берём x32 машину.

Делаем
let v: Vec<u64> = vec![0; isize::MAX / 4];


пихаем &v в твою функцию.
Делаем .index(len - 1) на получившуюся слайсу.
Получаем UB.
источник

в🧇

вафель 🧇 in Rust — русскоговорящее сообществo
Эрик
Берём x32 машину.

Делаем
let v: Vec<u64> = vec![0; isize::MAX / 4];


пихаем &v в твою функцию.
Делаем .index(len - 1) на получившуюся слайсу.
Получаем UB.
ugh. неприятно
источник

A

Aragaer in Rust — русскоговорящее сообществo
u64 будет занимать 4 соседних байта, но их не получится интерпретировать как 8 штук u8
источник