А теперь ложка дёгтя:
Корректность
Также нам приходится следить за тем, чтобы мы меняли элементы дека, но не сам дек как таковой. В идеале, стоило бы хранить соответствующий адаптер над деком, но такого адаптера (пока?) нет.
Корректность
get
довольно существенным образом зависит от проверки в new
, то есть от кода, напрямую не связанного с get
. В данном случае уследить за условиями было несложно, но в каком-то более сложно устроенном коде это было бы не так просто заметить. Отличная иллюстрация того, что unsafe может протекать.Также нам приходится следить за тем, чтобы мы меняли элементы дека, но не сам дек как таковой. В идеале, стоило бы хранить соответствующий адаптер над деком, но такого адаптера (пока?) нет.
Несмотря на то, что компилятор не следит за сырыми указателями, есть интерпретатор кода miri, который позволяет проверять корректность кода динамически. Мой первый вариант кода использовал
std::mem::transmute
для того, чтобы принудительно перезаписать lifetime, а ссылки брались через get_unchecked_mut
. Этот вариант давал ошибку в miri. Я не был уверен, кто был в данном случае неправ, поэтому задал соответствующий вопрос в официальном Rust чате в Discord. Очень хороший человек @udoprog потратил время на то, чтобы разобраться в моём коде и указать мне на то, что я действительно провоцирую подобным образом UB (так что miri таки был прав), и предложил использовать сырые указатели. Спасибо, @udoprog
Блог*
#prog #article Изобретаем JPEG Замечательная статья про устройство JPEG
Собственно, артефакты кодирования в виде квадратов на градиентах понятно откуда берутся. Я тут подумал: а что, если кодировать кусок, принимая во внимание не только данные в нём, но и вокруг него? По идее, это должно уменьшить артефакты. С другой стороны, это может снизить эффективность сжатия.
Почти уверен, что мысль не нова и уже кому-то приходила в голову. Если вы знаете о практической реализации этой идеи - напишите в чат, пожалуйста: @decltype_chat_ptr_t
Почти уверен, что мысль не нова и уже кому-то приходила в голову. Если вы знаете о практической реализации этой идеи - напишите в чат, пожалуйста: @decltype_chat_ptr_t
#prog #rust #article (🔁✏️➡️🦀)
Rewriting m4vgalib in Rust
"The results so far? The Rust implementation is simpler, shorter (in lines of code), faster, and smaller (in bytes of Flash) than my heavily-optimized C++ version — and because it's almost entirely safe code, several types of bugs that I fought regularly, such as race conditions and dangling pointers, are now caught by the compiler."
Rewriting m4vgalib in Rust
"The results so far? The Rust implementation is simpler, shorter (in lines of code), faster, and smaller (in bytes of Flash) than my heavily-optimized C++ version — and because it's almost entirely safe code, several types of bugs that I fought regularly, such as race conditions and dangling pointers, are now caught by the compiler."
Forwarded from Alex Levin
Представил в голове мир, где если у тебя итальянская локаль, то 44 > 1000 ибо сначала в римские числа переводит.