Ilya
Stanislav
ozkriff🇺🇦
@Golodnyi ну как, вышло у меня ответить или все равно не понятно?
Golodnyi
а тьфу, это let имеет конструктор
ozkriff🇺🇦
конструктор? если это не примитивный тип, то это просто функция обычно, LLVM такое статически выоптимизирует начисто почти всегда
Golodnyi
ну я когда спросил, каким образом приложение чистит память, если там нет GC, ты там дал линк на вики, в ней написано что траля-ля, есть конструктор вызываемый при создании переменной и диструктор вызываемый при выходе из области видимости. Получается что переменная имеет диструктор? Тоесть она хранит больше чем просто ссылку на значение или это let так работает или еще какой механизм?
Ilya
если реализован трейт дроп - он вызывается. Если нет - просто чистится память
Ilya
Простейшие типы транслируются в типы llvm
պլհկ
Большинство переменных в расте живут на стеке и деструктор нужен не очень часто
Golodnyi
"просто чистится память" звучит слишком просто
ozkriff🇺🇦
я бы даже сказал что у примитивных типов и память на стеке не чистится - они просто перезаписываются потом когда стек вызовов туда-сюда ходит
Ilya
Ах, ну да
Golodnyi
тоесть в этой ситуации
let a = 1
{
let b
}
b будет недоступна за пределами, но при этом память не очистит?
ozkriff🇺🇦
тип того. она просто станет мусором на стеке, пока на ее место что-то другое не запишут
Илья
Ilya
но такой конкретно код llvm выкинет)
ozkriff🇺🇦
(и если это просто целое число, то вообще не факт что оптимизатор ее тупо мимо стека в регистр процессора не положит)
ozkriff🇺🇦
https://doc.rust-lang.org/book/second-edition/ch15-03-drop.html советую полистать
Golodnyi
я перевод читаю, пока утомился читать, зашел узнать от практиков)
ozkriff🇺🇦
https://doc.rust-lang.org/book/second-edition/ch04-01-what-is-ownership.html - ну и может тут вот про владение, стек и время жизни
ozkriff🇺🇦
перевод есть, насколько я знаю, только первой редакции. во второй редакции многое понятней объяснено
Илья
кстати, насколько вторая редакция отличается от первой?
պլհկ
Сильно
պլհկ
Она с нуля писалась
Илья
спс
Konstantin
@notplhk да полно там копипасты
Ilya
не, не сказал бы что вообще все не так
Ilya
язык то один и тот же)
Ilya
перефразировали, улучшили
Ilya
но откровений нет
պլհկ
Да понятно что нового там ничего не может быть
Сережа
Как связаны вызов деструктора и стек? Про какой вы деструктор, про Drop в расте?
պլհկ
Да
ozkriff🇺🇦
V изначальный вопрос
ozkriff🇺🇦
и еще вопрос по памяти, я почитл чуть чуть, но не понял, в приложениях раста переменные автоматически уничтожаются как только они выходят из области видимости, если у раста нет gc, каким образом переменные уничтожаются?
պլհկ
Каким образом переменные в си уничтожаются, если там нет gc 🤔?
Golodnyi
писал, но читая про раст я почуял какую то магию управления памятью, при этом без gc, оказалось магии нет
Golodnyi
я вот думал с плюсов на раст переписать приложение, чтоб почуять разницу на своем дилетантском уровне, у вас же вроде биндинги qt и qml есть?
ozkriff🇺🇦
вон выше обсуждалось что все gui в ржавчине сейчас сырые. вряд ли это очень офигенный опыт будет
Сережа
http://play.integer32.com/?gist=86e6c686562fbf5df489926a34bfef58&version=stable
структура выделяется на стеке, после выхода из фрейма стека вызывается drop
Matwey
А чем принято превращать разные типы в вектор u8?
Хочу вместо 16-битного числа получить его байтовое представление, например.
Сережа
деструктор он не освобождает память, он освобождает объект концептуально. в расте в unsafe я могу явно выделить память на хипе или освободить? эти операции должны быть запрятаны в Box и т.д.
Marat
պլհկ
Ilya
պլհկ
Начинать лучше с консольных приложений
Loo
@vlad20012 при ренейминге полей в объявлении структуры - ренейминг внутри инициализаций не происходит.
Сережа
https://doc.rust-lang.org/stable/std/heap/struct.Heap.html
это в найтли, значит в стейбле я свой вектор не напишу? в стейбле нельзя память на хипе выделять?
պլհկ
через libc::malloc выделяй))
ozkriff🇺🇦
можно еще по crates.io полазать насчет всяких более удобных оберток вроде https://github.com/dropbox/rust-alloc-no-stdlib
Сережа
вы меня затролели, библиотека для выделения памяти на хипе
ozkriff🇺🇦
хотел еще https://docs.rs/slab скинуть, но он сам на Vec основан)
Сережа
а ваш раст же на микроконтроллерах есть, на cortex-m, без std, там этой либой память что-ли выделяют?
Сережа
или свой alloc.c пишут и линкуют его с растом?
պլհկ
https://doc.rust-lang.org/1.14.0/book/lang-items.html
պլհկ
на микроконтроллерах хип вообще юзают?
Сережа
на микроконтроллерах libc часто урезанная, я не удивлюсь если libc растовский из-за недостающих функций работать не будет
Сережа
да там даже c++ с его std юзают
ㅤ
ozkriff🇺🇦
да ладно микроконтроллеры, redox'ерам (https://redox-os.org/) всяким в ядре же тоже может быть нужно динамически память выделять? kmalloc там всякий
պլհկ
они уже сделали свой аллокатор, ralloc или как-то так
ozkriff🇺🇦
https://github.com/redox-os/ralloc ага, вижу. занятно
でゲソ
Marat
Marat
Или все ещё неизвестно
ozkriff🇺🇦
Евгений
Нет, а надо?
Нет, просто сейчас твои аргументы напоминают разговоры школьника с убунтой в дуалбуте, который трёт одноклассникам виндузятникам как круто сидеть за липупсом.
ozkriff🇺🇦
でゲソ
Golodnyi
ну суть же не в примере
でゲソ
Евгений