Size: a a a

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

2020 March 24

Э

Эрик in Rust — русскоговорящее сообществo
Alex Zhukovsky
Потому что в контракте строки не сказано что она _обязана_ быть хип аллокейтед. Значит это деталь реализации, писать код с потенциальным уб с оглядкой на текущую реализацию - хрень
This buffer is always stored on the heap.
источник

Э

Эрик in Rust — русскоговорящее сообществo
std::string::String.html#Representation
источник

AZ

Alex Zhukovsky in Rust — русскоговорящее сообществo
Эрик
This buffer is always stored on the heap.
окей, раньше там этого не припомню
источник

AZ

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

D

Denis in Rust — русскоговорящее сообществo
(напоминаю, что Rc/Arc/Box<str> занимает меньше места, чем String)
источник

Э

Эрик in Rust — русскоговорящее сообществo
Denis
(напоминаю, что Rc/Arc/Box<str> занимает меньше места, чем String)
Rc/Arc - нет.

struct RcBox<T: ?Sized> {
   strong: Cell<usize>,
   weak: Cell<usize>,
   value: T,
}

pub struct Rc<T: ?Sized> {
   ptr: NonNull<RcBox<T>>,
   phantom: PhantomData<RcBox<T>>,
}
источник

D

Denis in Rust — русскоговорящее сообществo
Эрик
Rc/Arc - нет.

struct RcBox<T: ?Sized> {
   strong: Cell<usize>,
   weak: Cell<usize>,
   value: T,
}

pub struct Rc<T: ?Sized> {
   ptr: NonNull<RcBox<T>>,
   phantom: PhantomData<RcBox<T>>,
}
я же скинул ссылку на плейграунд, ну
источник

Э

Эрик in Rust — русскоговорящее сообществo
Ты видишь, что Rc<str> в реальности занимает четыре usize?
источник

Э

Эрик in Rust — русскоговорящее сообществo
Nonnull на !Sized структуру - два юсайза, плюс внутри структуры два.
источник

В

Вафель in Rust — русскоговорящее сообществo
Alex Zhukovsky
этого нет в апи, значит на такое поведение рассчитывать нельзя
Ты путаешь стирание байтов и вызов Drop. Если бы вектор дропал элементы при реаллокации, это был бы уб. (В плане если бы он из дропал а потом перемещал)
источник

AZ

Alex Zhukovsky in Rust — русскоговорящее сообществo
Вафель
Ты путаешь стирание байтов и вызов Drop. Если бы вектор дропал элементы при реаллокации, это был бы уб. (В плане если бы он из дропал а потом перемещал)
я говорил про "сначла скопировал, а потом удалил"
источник

В

Вафель in Rust — русскоговорящее сообществo
Alex Zhukovsky
я говорил про "сначла скопировал, а потом удалил"
Αλεχ Zhukovsky, [24.03.20 13:59]
ничто не мешает вектору скопировать строку в новое место при аллокации и вызвать дроп на старой
источник

AZ

Alex Zhukovsky in Rust — русскоговорящее сообществo
Вафель
Αλεχ Zhukovsky, [24.03.20 13:59]
ничто не мешает вектору скопировать строку в новое место при аллокации и вызвать дроп на старой
"и" надо читать как "и после этого"
источник

В

Вафель in Rust — русскоговорящее сообществo
Alex Zhukovsky
"и" надо читать как "и после этого"
Всё равно, не любые данные валидно копировать
источник

Э

Эрик in Rust — русскоговорящее сообществo
И не любой дроп валидно вызывать.
источник

Э

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

AZ

Alex Zhukovsky in Rust — русскоговорящее сообществo
Вафель
Всё равно, не любые данные валидно копировать
я не про любые говорил, а про строки. Компилятор может спокойно специально генерировать код для случая вектора строк
источник

В

Вафель in Rust — русскоговорящее сообществo
Alex Zhukovsky
я не про любые говорил, а про строки. Компилятор может спокойно специально генерировать код для случая вектора строк
Ок, справедливо
источник

Э

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

Э

Эрик in Rust — русскоговорящее сообществo
Ну то есть, стоит ли оно того, чтобы перебороть свою лень?
источник