Блог*
Kanalga Telegram’da o‘tish
Блог со звёздочкой. Много репостов, немножко программирования. Небольшое прикольное комьюнити: @decltype_chat_ptr_t Автор: @insert_reference_here
Ko'proq ko'rsatish1 921
Obunachilar
-224 soatlar
-37 kunlar
-1530 kunlar
Postlar arxiv
1 921
#prog #rust
И ещё пример, когда это может выстрелить. Пусть у нас есть вот такой вот код для того, чтобы вынимать несколько элементов из вектор за раз:
fn pop_many<T, const N: usize>(arr: &mut Vec<T>) -> Option<[T; N]> {
let Some(new_len) = arr.len().checked_sub(N) else {
return None;
};
let mut ret = std::mem::MaybeUninit::<[T; N]>::uninit();
unsafe {
arr.set_len(new_len);
std::ptr::copy_nonoverlapping(
arr.as_ptr().add(new_len),
ret.as_mut_ptr().cast(),
N,
);
Some(ret.assume_init())
}
}
Достаточно прямолинейный код, на который не ругается miri (можете сами проверить). У кого-то может возникнуть мысль, что для лучше документированности кода можно использовать метод, который подчёркивает, что используется конец инициализированной части кода:
...
std::ptr::copy_nonoverlapping(
arr.as_ptr_range().end,
ret.as_mut_ptr().cast(),
N
);
...
Ииии этот код не работает... В том смысле, что если его проверить на, скажем, таком примере:
let mut v = vec![1, 2, 3];
let [_, _] = pop_many(&mut v).unwrap();
, то miri выдаёт ошибку. Почему?
Дело в том, что as_ptr_range (возвращающий Range<*const T>, к слову) — это метод не на векторе, а на слайсе, который вызывается тут за счёт deref coercion. Промежуточным этапом при вызове является создание &[T] — и ссылка даёт право использовать образованные от неё указатели только в рамках памяти, на которую эта ссылка указывает. В частности, это означает, что сделать указатель за конец этого слайса можно, но вот использовать его для доступа к следующей за этим слайсом неинициализированной части вектора нельзя.
TL;DR: не используйте конец диапазона, возвращённый .as_ptr_range() на векторе, для доступа к его неинициализированной части.1 921
#prog #article
Death by a thousand microservices
(thanks @heather_schlock)
The truth is that most companies will never reach the massive size that will actually require building a true distributed system. Your cosplaying Amazon and Google - without their scale, expertise, and endless resources - is very likely just an egregious waste of money and time. Religiously following all the steps from an article called “Ten morning habits of very successful people” is not going to make you a billionaire.
The only thing harder than a distributed system is a BAD distributed system.
1 921
Сочные сливы тут
Переходи по ссылке 👇
t.me/+gddTb8OBMAN80dFV
t.me/+gddTb8OBMAN80dFV
t.me/+gddTb8OBMAN80dFV
1 921
#prog #rust #zig #article
When Zig Outshines Rust - Memory Efficient Enum Arrays
Или об ограничениях Rust, вытекающих из отсутствия staged compilation
Endi mavjud! Telegram Tadqiqoti 2025 — yilning asosiy insaytlari 
