"В Rust есть специальная аннотация называемая типаж Copy, который можно

применить на типы вроде целых чисел, размещённых в стеке."

Что значит применить аннотацию Copy/аннотировать типажом Copy?
Правильно понимаю, что это означает, что для типов сохраняющихся на стеке не нужно явно вызывать метод clone() и применить аннотацию это лишь в контексте использования типажа для своих структур данных?

47 ответов

21 просмотр

impl Copy for T {} наверн

Не имеет значения на стеке/в куче. Грубо говоря, если ты пометил свой тип как Copy, то компилятор вместо move'а объекта данного типа будет автоматически вызывать для него clone().

Мне кажется это неправдой, если честно. Можешь подтвердить слова свои?

Yan-P Автор вопроса
Пашечка
Не имеет значения на стеке/в куче. Грубо говоря, е...

А на куче не нужно Drop вызывать, чтобы память с неё освободить?

mental stability🥺✨
Мне кажется это неправдой, если честно. Можешь под...

стек-куча для работы Copy не важны, да. let n = Box::new(0_u8); let b = *n; // поскольку u8 это Copy тип, то // n все еще доступен дальше

ozkriff🇺🇦 Lesnikóv
стек-куча для работы Copy не важны, да. let n = B...

Я к тому, что копи автоматически вызывает клонирование при семантике перемещения. Это действительно так?

Пух
impl Copy for T {} наверн

или просто #[derive(Clone, Copy)]

mental stability🥺✨
Я к тому, что копи автоматически вызывает клониров...

ну, в каком-то смысле. только "клонирование" в расте обычно значит Clone типаж, а Copy таки работает исключительно через побитовое копирование. Copy в плане реализации делает ровно то же что им перемещение, только не запрещает использовать источник дальше

ozkriff🇺🇦 Lesnikóv
ну, в каком-то смысле. только "клонирование" в рас...

Но подожди, всё-таки для пользовательских типов (или если Clone тоже от-derive-лен) да, побитовое копирование, а в остальных ситуациях - всё-таки дёргается реализация clone()

ozkriff🇺🇦 Lesnikóv
ну, в каком-то смысле. только "клонирование" в рас...

А разве clone запрещает? Ведь ссылку же берет, данные не тронуты

Пашечка
Но подожди, всё-таки для пользовательских типов (и...

в смысле? Copy всегда работает через побитовое копирование, какая бы там реализация Clone не была у типа

ozkriff🇺🇦 Lesnikóv
в смысле? Copy всегда работает через побитовое коп...

Да, ты прав, а я как всегда всё перепутал The behavior of Copy is not overloadable; it is always a simple bit-wise copy.

mental stability🥺✨
А разве clone запрещает? Ведь ссылку же берет, дан...

я, вроде, и не говорил, что клонирование запрещает использовать источник. вторая часть про сравнение с move уже была

Пашечка
Да, ты прав, а я как всегда всё перепутал The beha...

Вообще это странно 🤔 Надо будет пропозал оформить, чтобы всё-таки clone() дёргался х)

ozkriff🇺🇦 Lesnikóv
(ты же шутишь, правда?)

Неа. Моя логика такова: Copy это не автоматический маркер, чтобы его навесить надо провести "работу" - имплементировать Clone. Если я сконструировал некоторый тип данных, который не должен поддерживать move-семантику (хз зачем, но вдруг), то я могу хотеть вместо bit-wise copy использовать copy-as-clone.

Yan-P Автор вопроса
Yan P
А на куче не нужно Drop вызывать, чтобы память с н...

"Rust не позволит аннотировать тип с типажом Copy, если тип или любая его часть имеет реализацию типажа Drop" я странно выразился, и ещё не очень хорошее представление программы в памяти имею что вообще значит тип данных хранится на стеке/куче или посоветуйте хорошую ссылочку, пожалуйста, где об этом можно прочитать ещё не очень понимаю как значения в памяти представляются

Пашечка
Неа. Моя логика такова: Copy это не автоматический...

ну, такой pre-rfc никуда дальше не пройдет 200%. весь смысл copy в том что 1) компилятор досконально знает что тут происходит чисто побитовое копирование и можно все это спокойно оптимизировать 2) читатель тоже знает, что думать в этом месте надо только о размере типа и все

ozkriff🇺🇦 Lesnikóv
ну, такой pre-rfc никуда дальше не пройдет 200%. в...

Тогда Copy не совсем корректное название, кмк.

Yan-P Автор вопроса
ozkriff🇺🇦 Lesnikóv
стек-куча для работы Copy не важны, да. let n = B...

вот есть функция мейн, например, в которой этот код находится у неё есть стекфрейм, там есть переменные разных типов и для переменной n память не аллоцируется ведь из кучи(которая является участком в памяти)?

Пашечка
Тогда Copy не совсем корректное название, кмк.

Копи максимально корректное название для копирования структуры

ozkriff🇺🇦 Lesnikóv
s/Copy/POD/ :D

Вот кстати да, но нет х) Надо не заменить, а добавить и для реализации Copy требовать POD)

Yan-P Автор вопроса
ozkriff🇺🇦 Lesnikóv
стек-куча для работы Copy не важны, да. let n = B...

но тут все равно нельзя например дописать ниже так, да? let c = Box::new(0_u8);

Yan-P Автор вопроса
ozkriff🇺🇦 Lesnikóv
не понял мысль

в общем, я о том, что Box — не имеет трейт Copy и я изначально об этом говорил, в контексте того, что важно где тип "хранится"

Yan P
в общем, я о том, что Box — не имеет трейт Copy и ...

сам Box не Copy, это да. но его содержимое - уже может быть Copy.

Yan P
"Rust не позволит аннотировать тип с типажом Copy,...

Есть вроде неплохой ответ на stackoverflow https://stackoverflow.com/a/80113

Yan P
"Rust не позволит аннотировать тип с типажом Copy,...

А вообще, имеет смысл запрос вида "что есть стэк и куча" вбить в поисковик и читать статьи до полного просветления =))

Yan-P Автор вопроса
Денис
А вообще, имеет смысл запрос вида "что есть стэк и...

дыа, но хотел немного времени сэкономить и точечно попасть лучше

Yan P
дыа, но хотел немного времени сэкономить и точечно...

Ну, тогда имеет смысл ещё подождать, может у кого-то и вправду есть под рукой подходящие материалы)

Yan P
"Rust не позволит аннотировать тип с типажом Copy,...

https://doc.rust-lang.ru/book/ch04-01-what-is-ownership.html читал? вроде там вся основная инфа есть же

Yan-P Автор вопроса
ozkriff🇺🇦 Lesnikóv
https://doc.rust-lang.ru/book/ch04-01-what-is-owne...

да, но очень пространно ведь, чуть подробнее хочется мне бы понимать как значения/типы данных в памяти представляются и как это выглядит примерно хотя бы

Yan-P Автор вопроса
Yan P
да, но очень пространно ведь, чуть подробнее хочет...

в общем, эмпирически пойму, что ок цпумемори пока не хочется читать всем спасибо за ответы

Yan P
да, но очень пространно ведь, чуть подробнее хочет...

мне писания таненбаума в голову приходят, но хз настолько ли глубоко ты в это закапываться хочешь

Yan-P Автор вопроса
ozkriff🇺🇦 Lesnikóv
и про оси

да, пока многовато, мб это попробую прочитать/либо на хабре что-то https://people.freebsd.org/~lstewart/articles/cpumemory.pdf хорошая ссылка

Yan P
да, пока многовато, мб это попробую прочитать/либо...

Это, кажется, немного про другое, про железную часть, не про хип/стэк Хотя тоже полезно, но, конечно, сложно

Yan-P Автор вопроса
Денис
Это, кажется, немного про другое, про железную час...

Про стэк и кучу тоже есть Ну в общем да, чуть глубже, но покрывает то, что нужно

Yan P
Про стэк и кучу тоже есть Ну в общем да, чуть глуб...

Я детально не смотрел, так, пробежался поиском, но вроде они там скорее просто упоминаются

Yan-P Автор вопроса
Денис
Я детально не смотрел, так, пробежался поиском, но...

Что такое стэк и куча я понимаю, я вот скорее про это

Похожие вопросы

Обсуждают сегодня

Всем привет. Ребята, подскажите, пожалуйста. у ботов есть ограничение на отправку сообщений - 30 сообщений в секунду, эти ограничения накладываются на все сообщения? или на со...
Artem Stormageddon
4
Блин, ребята, сори за тупые вопросы. А можно ли как-то открыть вебапку по нажатию на кнопку в меню(которое появляется слева, команды)?
Artem Stormageddon
3
Ребята, всем привет. Подскажите, пожалуйста, можно ли как-то через бота понять, что этого бота добавили в группу\канал и выдали ему права администратора?
Artem Stormageddon
9
Привет всем! Почему этот код не срабатывает при добавлении или удалении пользователя из чата? bot.on('chat_member', async (ctx) => { console.log(ctx); }) bot.launch({allo...
Alexander
7
Всем привет. Не понимаю, в чём тут шутка юмора. Убирается только разрешение на send_messages. А send_media_messages остаётся. Как сделать, чтобы оба убирались? await b...
Alexander
2
Есть тут кто занимается разработкой серваков майна? Или знакомые
meow *
3
'frakturBold' => ['𝖆', '𝖇', '𝖈', '𝖉', '𝖊', '𝖋', '𝖌', '𝖍', '𝖎', '𝖏', '𝖐', '𝖑', '𝖒', '𝖓', '𝖔', '𝖕', '𝖖', '𝖗', '𝖘', '𝖙', '𝖚', '𝖛', '𝖜', '𝖝', '𝖞', '𝖟', '𝕬', '𝕭', '𝕮', '𝕯'...
Roma
4
Есть ли лимиты на кол-во вебхук по домену? Стоит в данный момент 900+ ботов и бывает бот перестает отвечать (не приходят вебхуки) 🐒 Помогает только перезапуск
ᅠ [ Кому не ответил, дублируйте ]
11
а что делать если тебя убивают на картах?
Yarik yarik kyda ti lezesh
43
Товарищи, здравствуйте Подскажите, пожалуйста, может кто-нибудь сталкивался с такой задачей Через вебапку можно сканировать qr-код, а есть ли возможность считывать nfc?
Artem Stormageddon
8
Карта сайта