мне не нравится реальность
505 subscribers
1.33K photos
57 videos
56 files
1.02K links
Мне не нравится реальность
N.B. waffle is unhinged

- кормить назад: @meowaffle
- кормить вперёд: github.com/sponsors/WaffleLapkin
- чят: https://xn--r1a.website/+5Dtuan4dVE5kYTcy
- блог: blog.ihatereality.space
Download Telegram
мне не нравится реальность
Сегодня весь день писал один хитрый вариант строк 👀 Устал, но доволен что оно работает и меня не забрали в ад. (Подробности позже)
Обещал подробности, вот они.

Ещё позавчера ночь мне пришла идея о том, что можно сделать хитрую структуру, которая будет как slice ([_]) но только массив строк, которые будут хранится inline. Полезность такой структуры мне ещё предстоит выяснить, но пока что выглядит многообещающе.

Если кратко, то у меня получилась структура вида
struct Strs {
len: usize,
buf: [u8],
}

len
— количество хранимых строк, buf — все данные, а именно: индексы строк и сами строки. Приправлено это знатным слоем unsafe{}.

Поскольку структура !Sized, использовать её можно только за каким-то указателем. Изначально предполагался Arc, но в целом может быть и Box, и Rc, и даже обычная ссылка.

Репозиторий тут: [strs]
Смотрите на свой страх и риск, там всё очень сырое. Работы ещё оооочень много :)
This media is not supported in your browser
VIEW IN TELEGRAM
Последние два дня полностью ушли на написание и переписывание этого чуда, сегодня я даже не обедал... Пойду поем и отдохну)
А можно было бы запинить 😏
Forwarded from Блог*
#prog

TIL, что мьютексы из POSIX threads нельзя перемещать.

Once a mutex is created, it cannot be validly copied or moved to a new location. If the mutex is copied or moved to a new location, the new object is not valid and should not be used. Any attempt to use the invalid object will produce unpredictable results.

Здесь. Что ж, это объясняет, почему мьютексы из стандартной библиотеки Rust боксят нативные мьютексы.
This media is not supported in your browser
VIEW IN TELEGRAM
Forwarded from <илья as Человек> (ilya sheprut)
В моей первой программе на расте щас вылезло 104 warning'а 🙂
У меня подписчиков, как у Ильи варнингов
Для извращений со строками мне нужно аллоцировать [MaybeUninit<usize>] в обёртке Arc/Box/Rc. До этого я использовал функции new_uninit_slice, доступные только на найтли, но сегодня я решил поискать stable-решение.

У меня получилось это:
iter::repeat(MaybeUninit::uninit()).take(len).collect()

Я думал сделать nightly фичу, чтобы люди на стейбле могли использовать немного более медленный вариант с итераторами, а на найтли использовалась бы более простая функция new_uninit_slice. (anyway создание Strs это редкая операция)

А потом я сравнил asm обоих вариантов... И знаете что? asm одинаковый. (godbolt)

Слава zero-cost абстракциям!
This media is not supported in your browser
VIEW IN TELEGRAM
КУДА БЛИННН ПОСТУПАТЬ
класссссс
Пришёл к интересной мысли: мне нужен &mut доступ к данным ненадолго, а потом & доступ к данным надолго. Т.е. что-то вроде:

fn init(data: &mut u32) -> Data {
*data -= 42;
Data { inner: &*data }
}

В таком варианте data будет эксклюзивно одолжена Data, не смотря на то, что Data может одалживать не эксклюзивно.

Такое ощущение что это не решается без рантайм проверок/с текущей системой типов. Но это не точно, надо ещё подумать.