Size: a a a

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

2020 August 23

Э

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

В

Вафель in Rust — русскоговорящее сообществo
Эрик
Количество usize'ов всегда известно?
да
источник

Э

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

V

Vladimir in Rust — русскоговорящее сообществo
Возьми лучше лейаут, юзать вектор, да ещё и with_capacity, да ещё и считать в байтах. Как по мне пахнет хуже) а в результате все равно работаешь с сырыми указателяит
источник

IB

Ivan Boldyrev in Rust — русскоговорящее сообществo
Вафель
Ну тоже вариант, хотя неприятно что место теряется
Оно в любом случае теряется, тебе malloc, например, всегда возвращает выравненный результат.
источник

В

Вафель in Rust — русскоговорящее сообществo
Ivan Boldyrev
Оно в любом случае теряется, тебе malloc, например, всегда возвращает выравненный результат.
Это уже дело аллокатора
источник

Э

Эрик in Rust — русскоговорящее сообществo
Ну вот. Тогда реаллокация под байты выглядит как

fn realloc(&mut self, additional_bytes_over_current_capacity: usize) {
 let mut new_v: Vec<usize> = Vec::with_capacity(
   self.v.capacity() + additional_bytes_over_current_capacity / size_of::<usize>()
   + (additional_bytes_over_current_capacity % size_of::<usize>() != 0) as usize
 );

 unsafe {
 ptr::copy_nonoverlapping(self.v.as_ptr() as *const u8, new_v.as_mut_ptr() as *mut u8, self.usizes * size_of::<usize>() + self.bytes_len);
 }

 self.v = new_v;
}
источник

В

Вафель in Rust — русскоговорящее сообществo
Vladimir
Возьми лучше лейаут, юзать вектор, да ещё и with_capacity, да ещё и считать в байтах. Как по мне пахнет хуже) а в результате все равно работаешь с сырыми указателяит
В итоге такое получается:

let base = Layout::new::<usize>();
let (with_usizes, offset0) = base.extend(Layout::array::<usize>(usizes).unwrap()).unwrap();
let (full, offset1) = with_usizes.extend(Layout::array::<u8>(bytes).unwrap()).unwrap();
источник

В

Вафель in Rust — русскоговорящее сообществo
Эрик
Ну вот. Тогда реаллокация под байты выглядит как

fn realloc(&mut self, additional_bytes_over_current_capacity: usize) {
 let mut new_v: Vec<usize> = Vec::with_capacity(
   self.v.capacity() + additional_bytes_over_current_capacity / size_of::<usize>()
   + (additional_bytes_over_current_capacity % size_of::<usize>() != 0) as usize
 );

 unsafe {
 ptr::copy_nonoverlapping(self.v.as_ptr() as *const u8, new_v.as_mut_ptr() as *mut u8, self.usizes * size_of::<usize>() + self.bytes_len);
 }

 self.v = new_v;
}
Мне Vec по многим причинам не подходит. Я специально пытаюсь в Unsized тип чтобы его можно было и в Box и в Rc и в Arc завернуть
источник

Э

Эрик in Rust — русскоговорящее сообществo
Вафель
Мне Vec по многим причинам не подходит. Я специально пытаюсь в Unsized тип чтобы его можно было и в Box и в Rc и в Arc завернуть
Ну, тут без зав типов не сможешь.
источник

В

Вафель in Rust — русскоговорящее сообществo
Эрик
Ну, тут без зав типов не сможешь.
Смогу. Нужно только ручками аллокатор подёргать очень аккуратно
источник

Э

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

В

Вафель in Rust — русскоговорящее сообществo
нет, вся std пользует глобальный
источник

Э

Эрик in Rust — русскоговорящее сообществo
Он там как раз делает Layout::new::<[AtomicUsize; 2]>().extend(&unsized_struct).
источник

Э

Эрик in Rust — русскоговорящее сообществo
Чтобы счётчики инлайнить.
источник

В

Вафель in Rust — русскоговорящее сообществo
Но для Arc'а будет реалок из бокса видимо :shrug:
источник

Э

Эрик in Rust — русскоговорящее сообществo
size_of_val нет для твоей структуры, чтобы Layout нормально extend'ился.
источник

Э

Эрик in Rust — русскоговорящее сообществo
Либо придётся как-то хитро трансмутить в [u8]
источник

Э

Эрик in Rust — русскоговорящее сообществo
А потом готовый Arc трансмутить обратно.
источник

В

Вафель in Rust — русскоговорящее сообществo
Не очень понимаю о чём ты, можно просто воспользоваться

impl<T: ?Sized> From<Box<T>> for Arc<T>
источник