#rust
Add panic_unreachable_unchecked feature flag to the standard library
Add panic_unreachable_unchecked feature flag to the standard library
This is similar to panic_immediate_abort except that all panics are considered immediate UB and can therefore be optimized away as unreachable by the compiler.
This has been tested on regalloc3 where it resulted in a 10% speedup compared to using a normal standard library, mainly due to the elimination of bounds checks.
While it may seem that this feature merely to satisfy those with a reckless thirst for performance at any cost, it is also useful for saner heads as a profiling tool to investigate the impact of unnecessary safety check and find places where unsafe code could be used to avoid them.
❤🔥9🤡3👍1
Умному мальчику Антону было 27 лет, когда до него дошло, что "сантехника" — это сокращение от "санитарная техника".
🤡20🤯16🎉6🌚4😁2
#prog #rust #rustreleasenotes
Вышла версия Rust 1.86.0! Как всегда, тут только примечательное для меня, а остальное — в полных заметках о релизе.
В этот раз релиз, по большому счёту, состоит из одной фичи (двух, если вы пишете код с SIMD).
▪️Как я уже писал, стабилизировали апкаст трейтов:
Этот апкаст также работает и через сырые указатели, поэтому пока что — до тех пор, пока не определились с точными гарантиями — создавать сырые указатели на
▪️По умолчанию компилятор Rust генерирует исполняемые файлы, которые могут работать на всех процессорах целевой платформы. Это означает, помимо всего прочего, невозможность использования процессорно-специфичных наборов инструкций (на практике важнее всего расширения для SIMD). Для того, чтобы обойти эти ограничения и заставить компилятор генерировать код с использованием дополнительного конкретного набора инструкций, в языке есть атрибут
Так как использование на процессоре инструкций, которые он не распознаёт — неопределённое поведение, вызов подобных функций должен быть только в unsafe блоке. Программист при вызове обещает, что этот код недостижим на платформах, на которых указанный набор инструкций не поддерживается.
Это логичное поведение, но у начальной реализации был заметный эргономический недостаток: вызов функции с, скажем,
▪️Продолжая тему, начатую в Rust 1.70.0, компилятор теперь при компиляции в отладочном профиле (и с флагом
Эта проверка уже нашла ошибки в реальных проектах, как во время crater run, так и после мерджа.
▪️Ошибка
▪️Теперь можно получить мутабельные ссылки по нескольким индексам/ключам из слайса и хэшмапы одновременно с новыми методами <[_]>::get_disjoint_mut и HashMap::get_disjoint_mut, вместе с unsafe *
Что мне не очень нравится в этих методах — неконсистентность. Именно, версия для слайсов возвращает массив ссылок или ошибку, причём как в случае пересекающихся индексов, так и в случае индексов, выходящих за длину слайса. Версия же для мапы возвращает массив опциональных ссылок (с
▪️
▪️В const-контексте теперь можно, помимо всего прочего, разбивать строку по индексу (включая мутабельно и с опциональным возвратом) и проверять, что индекс лежит между отдельными char-ами.
▪️Компилятор для Linux на ARM теперь компилируется с ThinLTO и PGO, что ускоряет его на бенчмарках на 10-20%, в некоторых случаях — даже на 30%!.
Вышла версия Rust 1.86.0! Как всегда, тут только примечательное для меня, а остальное — в полных заметках о релизе.
В этот раз релиз, по большому счёту, состоит из одной фичи (двух, если вы пишете код с SIMD).
▪️Как я уже писал, стабилизировали апкаст трейтов:
trait Super1 {}
trait Super2 {}
trait Combined: Super1 + Super2 {}
fn foo(x: &dyn Combined) {
let _: &dyn Super1 = x;
let _: &dyn Super2 = x;
}
Этот апкаст также работает и через сырые указатели, поэтому пока что — до тех пор, пока не определились с точными гарантиями — создавать сырые указатели на
dyn Trait
с невалидной vtable-частью запрещено и считается UB. В miri на этот счёт уже есть соответствующие проверки.▪️По умолчанию компилятор Rust генерирует исполняемые файлы, которые могут работать на всех процессорах целевой платформы. Это означает, помимо всего прочего, невозможность использования процессорно-специфичных наборов инструкций (на практике важнее всего расширения для SIMD). Для того, чтобы обойти эти ограничения и заставить компилятор генерировать код с использованием дополнительного конкретного набора инструкций, в языке есть атрибут
#[target_feature(enable = "...")]
. Он позволяет компилятору генерировать код с использованием расширенного набора инструкций. Так как использование на процессоре инструкций, которые он не распознаёт — неопределённое поведение, вызов подобных функций должен быть только в unsafe блоке. Программист при вызове обещает, что этот код недостижим на платформах, на которых указанный набор инструкций не поддерживается.
Это логичное поведение, но у начальной реализации был заметный эргономический недостаток: вызов функции с, скажем,
#[target_feature(enable = "avx")]
из другой функции с #[target_feature(enable = "avx")]
также требовал unsafe-блока, даже не смотря на то, что требование на корректный вызов в этом случается удовлетворяется автоматически и это можно проверить статически. Начиная с этой версии подобные функции можно вызывать друг из друга без unsafe-блока при условии, что наборы включённых фич совпадают.▪️Продолжая тему, начатую в Rust 1.70.0, компилятор теперь при компиляции в отладочном профиле (и с флагом
-C debug-assertions
) вставляет паникующие проверки на null при разыменовывании сырых указателей. К сожалению, так как std поставляется только в release-сборке, на коде из std это не сказывается. (Это можно обойти, но требует nightly).Эта проверка уже нашла ошибки в реальных проектах, как во время crater run, так и после мерджа.
▪️Ошибка
FromBytesWithNulError
, которая может быть возвращена из CStr::from_bytes_with_nul
, теперь является enum
и позволяет в случае nul внутри данных получить его позицию.▪️Теперь можно получить мутабельные ссылки по нескольким индексам/ключам из слайса и хэшмапы одновременно с новыми методами <[_]>::get_disjoint_mut и HashMap::get_disjoint_mut, вместе с unsafe *
_unchecked
вариантами, дающими UB при пересечении. Версия для слайсов при этом также позволяет индексировать диапазонами, а не только единичными индексами.Что мне не очень нравится в этих методах — неконсистентность. Именно, версия для слайсов возвращает массив ссылок или ошибку, причём как в случае пересекающихся индексов, так и в случае индексов, выходящих за длину слайса. Версия же для мапы возвращает массив опциональных ссылок (с
None
для ключей без значений) и паникует на пересекающихся ключах.▪️
Once
и OnceLock
обзавелись методами для блокировки в ожидании инициализации.▪️В const-контексте теперь можно, помимо всего прочего, разбивать строку по индексу (включая мутабельно и с опциональным возвратом) и проверять, что индекс лежит между отдельными char-ами.
▪️Компилятор для Linux на ARM теперь компилируется с ThinLTO и PGO, что ускоряет его на бенчмарках на 10-20%, в некоторых случаях — даже на 30%!.
👍9❤3🔥1
Forwarded from На хую vercheniye 🇮🇱🇺🇦
Кстати, это теперь канал биржевых новостей, отписывайтесь
#vercheniye_news
#vercheniye_news
😁28🔥2🌚1
Forwarded from Давыдов еще не ложился
Сейчас я вам расскажу, как разыгрывать «русскую карту». Начнем с примера. Ща одна женщина мне говорит, типа, как тебе не холодно в одной футболке, а я говорю сурово по-немецки: «Я в России родился». Я всегда разыгрываю карту русского, когда не знаю че ответить.
Думаю, принцип ясен. Давайте еще примеров.
— Почему со мной не разговариваешь?
— Я из России. В России говорит только один человек.
— Почему посуда грязная?
— Я из России. В России посуду моют медведи. Люди отмывают только деньги.
— Почему домашка не сделана?
— Я из России, в России домашка — это строить коммунизм.
— Послушайте, Дмитрий…
— Я из России, я Лжедмитрий.
— Сколько времени?
— Я из России, так что время для революции.
— Ты почему оказался в дурдоме?
— Я из России.
Думаю, принцип ясен. Давайте еще примеров.
— Почему со мной не разговариваешь?
— Я из России. В России говорит только один человек.
— Почему посуда грязная?
— Я из России. В России посуду моют медведи. Люди отмывают только деньги.
— Почему домашка не сделана?
— Я из России, в России домашка — это строить коммунизм.
— Послушайте, Дмитрий…
— Я из России, я Лжедмитрий.
— Сколько времени?
— Я из России, так что время для революции.
— Ты почему оказался в дурдоме?
— Я из России.
😁26🤡4
Forwarded from лингвист реалист
Обожаю запрещенку в Армении!
Подруга приехала в гости и купила 😁 Приедет в Россию с контрабандой...
Подруга приехала в гости и купила 😁 Приедет в Россию с контрабандой...
🥰20🤡7🤣6🤷1