Size: a a a

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

2020 March 24

Э

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

D

Denis in Rust — русскоговорящее сообществo
Эрик
Дорого. Кроме коровы, но она может даже дороже выйти, если вдруг посчитает, что я что-то куда-то пишу.
она не посчитает "вдруг" + это дешевле потенциальной ошибки, которую ты можешь совершить просто из-за банальной невнимательности
источник

D

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

Э

Эрик in Rust — русскоговорящее сообществo
Ну, так-то ты прав, но Cow занимает три usize'a, плюс флаг Enum'a для стринги. И если на размер [&str; 10] как бы пофигу, то вектор там может быть довольно большим.
источник

D

Denis in Rust — русскоговорящее сообществo
а Rc?
источник

Э

Эрик in Rust — русскоговорящее сообществo
Та же фигня, размер раздувает.
источник

Э

Эрик in Rust — русскоговорящее сообществo
println!(
       "Hello, world! Cow: {}, String: {}",
       size_of::<Cow<'static, str>>(),
       size_of::<String>()
   );

Hello, world! Cow: 32, String: 24
источник

r

red75prime in Rust — русскоговорящее сообществo
Эрик
Та же фигня, размер раздувает.
*const str
источник

Э

Эрик in Rust — русскоговорящее сообществo
red75prime
*const str
Но почему не ссылку? То есть, разуеется, эта срань ансейф, но почему его надо во все места пораспихать?
источник

r

red75prime in Rust — русскоговорящее сообществo
Эрик
Но почему не ссылку? То есть, разуеется, эта срань ансейф, но почему его надо во все места пораспихать?
Потому что трансмут - потенциальный UB
источник

Э

Эрик in Rust — русскоговорящее сообществo
red75prime
Но компилятор этого не знает, и не знает, что ссылка как-то связана с массивом. Так что имеет право сделать например такую оптимизацию наша_типа_статическая_str.ptr_eq(&vec[0]) -> false.
Кстати, да, может и UB выстрелить.
источник

Э

Эрик in Rust — русскоговорящее сообществo
Спасибо.
источник

AZ

Alex Zhukovsky in Rust — русскоговорящее сообществo
red75prime
*const str
но *const str разыменовывать на невалидную память тоже уб
источник

Э

Эрик in Rust — русскоговорящее сообществo
Так-то там эти псевдо-статик ссылки только между собой сравниваются, но мало ли. Пойду исправлю.
источник

AZ

Alex Zhukovsky in Rust — русскоговорящее сообществo
что выигрываем-то?
источник

Э

Эрик in Rust — русскоговорящее сообществo
Alex Zhukovsky
но *const str разыменовывать на невалидную память тоже уб
Почему ты до сих пор считаешь, что память может быть невалидна?
источник

BV

Boris Vinogradov in Rust — русскоговорящее сообществo
Эрик
Почему ты до сих пор считаешь, что память может быть невалидна?
потому что она может быть невалидна?
источник

AZ

Alex Zhukovsky in Rust — русскоговорящее сообществo
Эрик
Почему ты до сих пор считаешь, что память может быть невалидна?
Потому что в контракте строки не сказано что она _обязана_ быть хип аллокейтед. Значит это деталь реализации, писать код с потенциальным уб с оглядкой на текущую реализацию - хрень
источник

D

Denis in Rust — русскоговорящее сообществo
Эрик
Та же фигня, размер раздувает.
источник

r

red75prime in Rust — русскоговорящее сообществo
Alex Zhukovsky
но *const str разыменовывать на невалидную память тоже уб
Если в вектор только пушим, то UB не будет. Со ссылкой мы можем получить UB на ровном месте: наша_типа_статическая_str.ptr_eq(&vec[0])
источник