2015-05-10 3 views
2

Интересно, использует ли Rust какой-либо идентификатор экземпляра для каждого объекта за кулисами, и если да, то можно сделать видимым.Отслеживаются уникальные идентификаторы объектов, и можем ли мы их распечатать?

Рассмотрим

struct SomeStruct ; 

fn main() { 
    let some_thing = SomeStruct; 
    println!("{:UniqueId}", some_thing); 
    let another = some_thing; 
    println!("{:UniqueId}", another); 
} 

Я использую формат строки псевдо с {:UniqueId} здесь. В этом случае он может распечатать

4711 
4712 

Я знаю, что Rust делает побистую копию, и я хочу сделать это на самом деле видимым. Если бы у меня был такой идентификатор экземпляра, я мог бы сделать это видимым, сравнив идентификаторы.

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

+0

Для вашего примера 'SomeStruct' не' Copy'able, поэтому он будет перемещен. Когда что-то двигается, вы хотите, чтобы ID объекта был таким же или другим? – Shepmaster

+0

Но перемещение также просто побитовое копирование с той разницей, что старое место становится недействительным (перемещение собственности). Поэтому в основном я хочу сделать видимым, что это действительно разные куски памяти;) – Christoph

+0

* «Но движение тоже просто побитовое копирование» * не обязательно. В вашем примере ничего не будет скопировано, потому что нет ничего ** для ** копирования :-). В общем, я считаю, что компилятор также может свободно оптимизировать ходы, которые не изменяют поведение программы. – Shepmaster

ответ

3

Насколько мне известно, адрес элемента уникален, как вы можете получить:

struct SomeStruct ; 

fn main() { 
    let some_thing = SomeStruct; 
    println!("{:p}", &some_thing); 
    let another = some_thing; 
    println!("{:p}", &another); 
} 

Все * занимает место где-то, так что вы можете получить адрес этого места и распечатать это.

Возможно, это уникально для некоторых случаев. Например, когда вы передаете право собственности на элемент, вы можете ожидать, что идентификатор останется прежним. Я думаю, в этом случае вам придется сворачивать самостоятельно. Что-то вроде глобальной атомной переменной, которую вы можете извлечь, когда вы создаете объект. Конечно, это не относится к объектам, которые вы не контролируете.

Вообще-то, такие вещи нанесут некоторые накладные расходы, а Руста хочет наложить как можно меньше накладных расходов. Все остальное должно быть включено.

* Ну, почти все. Я знаю, что у предметов const не гарантируется наличие места, поэтому есть static предметов.

+0

Mmh ... ОК. В этом примере он печатает два разных адреса, чтобы он копировал. Вы прокомментировали выше, что он не будет копировать. Я смущен;) – Christoph

+0

@ Кристоф, я предполагаю, что оптимизация вступает в игру. Мои психические силы говорят, что вы компилируете это локально как «rustc foo.rs». Если да, попробуйте добавить '-O'^_ ^. Когда я запускаю код в [playpen] (http://is.gd/yOM8IE), я вижу две строки того же значения для '-O2' и два разных значения для' -O0'. – Shepmaster

+0

Ах! Интересно, классно :) – Christoph

Смежные вопросы