by

Where communities thrive


  • Join over 1.5M+ people
  • Join over 100K+ communities
  • Free without limits
  • Create your own community
People
Activity
Psilon
@Pzixel
не раньше чем всё перезаписали данными!
sobaka_v_kepke
@chabapok_twitter
дело в том, что вызов assume_init() копирует данные. И раз так происходит, то смысл использования MaybeUninit теряется. Проще и быстрей просто залить массив нулями вообще без unsafe.
Psilon
@Pzixel
не копирует
sobaka_v_kepke
@chabapok_twitter
доказательство того, что данные копируются - это разные адреса указателей https://play.rust-lang.org/?version=stable&mode=release&edition=2018&gist=99e1edd47c6886a8f35807aa7d246323
Там на самом деле сам по себе вызов может и не копирует, но вызвать его можно только внутри unsafe{ } и происходит move. Поэтому как ни крути - а копирование есть. А раз оно есть, то теряется смысл использования неинициализированных буферов
Psilon
@Pzixel
https://doc.rust-lang.org/beta/std/mem/union.MaybeUninit.html#safety к слову обрати внимание на safety
вообще по сорцам оно не должно особо ничего копировать
sobaka_v_kepke
@chabapok_twitter
@Pzixel та я ж говорю - оно может само по себе и не копирует. Но когда делается let a=b то это move само по себе. И это копирование. Поэтому let a=unsafe{ x.assume_init()} - это копирование
я кстати это спрашивал когда-то https://users.rust-lang.org/t/how-to-avoid-copying-data-with-maybeuninit/30513/2
Psilon
@Pzixel
да, помню этот вопрос
sobaka_v_kepke
@chabapok_twitter
я все еще считаю, что они убили весь смысл использования неинициализированной памяти
Psilon
@Pzixel
мб
если аккуратно то можно через get_mut доставать данные и не забыть дропнуть в конце
А как им было сделать иначе? Так мувы в расте работают
sobaka_v_kepke
@chabapok_twitter
нужно было сделать специальный костыль, который в данном конкретном случае мува не делает.
Psilon
@Pzixel
не уверен что такой костыль вообще возможен
работа со стеком, вызовы функции - это всё что аффектится
и это супер базовые вещи
sobaka_v_kepke
@chabapok_twitter
хм
Psilon
@Pzixel
это даже специальная логика для let x = y если у нас униниты
sobaka_v_kepke
@chabapok_twitter
они даже в документации написали что есть копирование: https://doc.rust-lang.org/std/mem/union.MaybeUninit.html#correct-usage-of-this-method-1`
// However, using `.assume_init()` may trigger a `memcpy` of the 2048 bytes.
Вобщем, нужно ждать, когда они стабилизируют feature(maybe_uninit_ref)
Psilon
@Pzixel
только если тебе не нужны методы которые работают по-значению
впрочем, на больших объектах таких методов не делают
sobaka_v_kepke
@chabapok_twitter
мне нужно в стеке относительно большой массив неинициализированный. И с этим массивом, с какой-то его частью, поработать. Обычная, вобщем-то, задача
Psilon
@Pzixel
sobaka_v_kepke
@chabapok_twitter
Это вроде и то - но не совсем то. Хотя где-то рядом. У них там N=2. А если сделать N=20000, то не скомпилится.
sobaka_v_kepke
@chabapok_twitter
И там речь идет про оптимизатор, к тому же. Если сделать N=2000 то оптимизатор делает одинаковый код https://rust.godbolt.org/z/rz9E7E но только при уровне оптимизации -C opt-level=2 и выше
Это немножко не то.
Nickolay
@nnovikov
а кто-нибудь встречал хорошие доки/howto по syn и quote?
Сухарик
@suhr
Нет, но их собственная документация вполне норм.
Nickolay
@nnovikov
https://crates.io/crates/async-backplane
прикольный проект
sobaka_v_kepke
@chabapok_twitter
А у структуры порядок инициализации полей не нормируется же?
и если да, то это ж получается что у нас будет UB в таком коде https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=e0172ad3983ce2d14069513da32dd0fd
Denis Lisov
@tanriol
Почему не нормируется?
sobaka_v_kepke
@chabapok_twitter
нормируется?
Похоже, что да.
Denis Lisov
@tanriol
Мне кажется, что, вне зависимости от порядка инициализации полей при создании структуры, эти выражения выполняются ровно в том порядке, в котором они в коде.
Ну или я не так понимаю, где ты UB видел...
sobaka_v_kepke
@chabapok_twitter
так. Все так. Был страх, что если компилятор решит переупорядочить поля - то переупорядочит чтение с массива
но похоже что нет, в расте даже тест есть https://github.com/rust-lang/rust/blob/master/src/test/ui/structs-enums/struct-order-of-eval-2.rs
Nickolay
@nnovikov
а никто не встречал либу для bash brace expand? Вдруг есть готовая и не надо самому писать?
koshkin-na
@koshkin-na
Привет, подскажите пожалуйста, как лучше сделать.
У меня HTTP сервер на actix-web (actix-rt runtime), к нему дописываю scheduler, типа cron, работает в отдельном потоке, но там тоже
используются асинхронные функции, то есть мне туда нужно прокинуть tokio::Runtime.
Пока вижу два варианта: просто в новом потоке заново создать новый tokio::Runtime, или же прокинуть в новый поток handler из корневого рантайма. Как более правильно и производительно?
Alexander Irbis
@alexander-irbis
@koshkin-na
Если через хендл запускать на рантайме первого потока, ты запускаться таски будут именно в первом потоке.
Чтобы что-то асинхронное запустить во втором потоке, там нужно будет поднять рантайм - или с помощью tokio, или с помощью самого актикса. Без собственного рантайма ничего асинхронного там не будет.
Ещё маленькая деталь: актикс-веб запускает не один поток для обработки веб-запросов и может их перезапускать в случае падений (и такое случается).
Поэтому будет логичным, если у крона будет свой отдельный независимый поток, а где будет запускаться то, что будет напланировано с его помощью - это уже отдельный вопрос.
Что будет производительнее - зависит от нагрузки. Если задач мало и они "маленькие" - всё будет очень хорошо работать в одном потоке и не сильно будет мешать крону. Если задачи "не вмещаются" в поток или есть "тяжёлые" вычислительные или блокирующие задачи, занимающие много времени на выполнение без переключения, - нужно думать про вынесение мешающих задач в отдельный поток или о распределении их на пул потоков - опять же, по ситуации.
Nickolay
@nnovikov
а кто с какими rpc протоколами в расте работает? кроме гугловского протобафа?
cap'n'proto есть, а что еще?
Denis Lisov
@tanriol
@Voodlaz Возможно, имеет смысл сразу указывать, что это видео - не всем комфортно работать с видеоматериалами.