применить на типы вроде целых чисел, размещённых в стеке."
Что значит применить аннотацию Copy/аннотировать типажом Copy?
Правильно понимаю, что это означает, что для типов сохраняющихся на стеке не нужно явно вызывать метод clone() и применить аннотацию это лишь в контексте использования типажа для своих структур данных?
impl Copy for T {} наверн
Не имеет значения на стеке/в куче. Грубо говоря, если ты пометил свой тип как Copy, то компилятор вместо move'а объекта данного типа будет автоматически вызывать для него clone().
Мне кажется это неправдой, если честно. Можешь подтвердить слова свои?
А на куче не нужно Drop вызывать, чтобы память с неё освободить?
стек-куча для работы Copy не важны, да. let n = Box::new(0_u8); let b = *n; // поскольку u8 это Copy тип, то // n все еще доступен дальше
Я к тому, что копи автоматически вызывает клонирование при семантике перемещения. Это действительно так?
или просто #[derive(Clone, Copy)]
ну, в каком-то смысле. только "клонирование" в расте обычно значит Clone типаж, а Copy таки работает исключительно через побитовое копирование. Copy в плане реализации делает ровно то же что им перемещение, только не запрещает использовать источник дальше
Но подожди, всё-таки для пользовательских типов (или если Clone тоже от-derive-лен) да, побитовое копирование, а в остальных ситуациях - всё-таки дёргается реализация clone()
А разве clone запрещает? Ведь ссылку же берет, данные не тронуты
в смысле? Copy всегда работает через побитовое копирование, какая бы там реализация Clone не была у типа
Да, ты прав, а я как всегда всё перепутал The behavior of Copy is not overloadable; it is always a simple bit-wise copy.
я, вроде, и не говорил, что клонирование запрещает использовать источник. вторая часть про сравнение с move уже была
Вообще это странно 🤔 Надо будет пропозал оформить, чтобы всё-таки clone() дёргался х)
(ты же шутишь, правда?)
Неа. Моя логика такова: Copy это не автоматический маркер, чтобы его навесить надо провести "работу" - имплементировать Clone. Если я сконструировал некоторый тип данных, который не должен поддерживать move-семантику (хз зачем, но вдруг), то я могу хотеть вместо bit-wise copy использовать copy-as-clone.
"Rust не позволит аннотировать тип с типажом Copy, если тип или любая его часть имеет реализацию типажа Drop" я странно выразился, и ещё не очень хорошее представление программы в памяти имею что вообще значит тип данных хранится на стеке/куче или посоветуйте хорошую ссылочку, пожалуйста, где об этом можно прочитать ещё не очень понимаю как значения в памяти представляются
ну, такой pre-rfc никуда дальше не пройдет 200%. весь смысл copy в том что 1) компилятор досконально знает что тут происходит чисто побитовое копирование и можно все это спокойно оптимизировать 2) читатель тоже знает, что думать в этом месте надо только о размере типа и все
Тогда Copy не совсем корректное название, кмк.
вот есть функция мейн, например, в которой этот код находится у неё есть стекфрейм, там есть переменные разных типов и для переменной n память не аллоцируется ведь из кучи(которая является участком в памяти)?
Копи максимально корректное название для копирования структуры
Вот кстати да, но нет х) Надо не заменить, а добавить и для реализации Copy требовать POD)
но тут все равно нельзя например дописать ниже так, да? let c = Box::new(0_u8);
в общем, я о том, что Box — не имеет трейт Copy и я изначально об этом говорил, в контексте того, что важно где тип "хранится"
сам Box не Copy, это да. но его содержимое - уже может быть Copy.
Есть вроде неплохой ответ на stackoverflow https://stackoverflow.com/a/80113
прикольно, понятно
А вообще, имеет смысл запрос вида "что есть стэк и куча" вбить в поисковик и читать статьи до полного просветления =))
дыа, но хотел немного времени сэкономить и точечно попасть лучше
Ну, тогда имеет смысл ещё подождать, может у кого-то и вправду есть под рукой подходящие материалы)
https://doc.rust-lang.ru/book/ch04-01-what-is-ownership.html читал? вроде там вся основная инфа есть же
да, но очень пространно ведь, чуть подробнее хочется мне бы понимать как значения/типы данных в памяти представляются и как это выглядит примерно хотя бы
в общем, эмпирически пойму, что ок цпумемори пока не хочется читать всем спасибо за ответы
мне писания таненбаума в голову приходят, но хз настолько ли глубоко ты в это закапываться хочешь
архитектура компьютера?
да, пока многовато, мб это попробую прочитать/либо на хабре что-то https://people.freebsd.org/~lstewart/articles/cpumemory.pdf хорошая ссылка
Это, кажется, немного про другое, про железную часть, не про хип/стэк Хотя тоже полезно, но, конечно, сложно
Про стэк и кучу тоже есть Ну в общем да, чуть глубже, но покрывает то, что нужно
Я детально не смотрел, так, пробежался поиском, но вроде они там скорее просто упоминаются
Что такое стэк и куча я понимаю, я вот скорее про это
у тебя скобочки отвалились
Обсуждают сегодня