2017-02-20 47 views
7

Когда типы, такие как Vec, запустите truncate, они назовут ptr::drop_in_place на каждый элемент вектора.Как определить, требуется ли вызов «drop» для типа?

Это не проблема производительности для примитивных типов, таких как int, float и т. Д., Потому что вызовы сброса оптимизированы.

Для более сложных типов контейнеров (те, которые я написал для собственного использования), повторение элементов может быть не таким тривиальным (и может не всегда оптимизироваться).

Есть ли способ проверить, имеет ли тип черту drop, так что в таком случае можно избежать посещения всех членов?

ответ

5

std::intrinsics::needs_drop все еще нестабилен, но если вы можете справиться с этим, это лучший способ проверить это.

+0

Описание в документации, с которой вы связаны, похоже, подразумевает, что: все типы либо _require drop glue_, либо _implement Copy_, но оба они оба. Это звучит не так. –

+0

@PeterHall Это не означает, что все типы делают одну из этих вещей, и на самом деле явно упоминают типы, которые не являются ни тем, ни другим. Но действительно верно, что «Copy» является взаимоисключающим с наличием drop clue - типов, которые сами являются «Drop» или содержат вещи, которые являются «Drop» (критерии для нанесения клея) никогда не могут быть «Copy». – delnan

3

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

fn foo<T: Drop>(t: T) {} 

foo(5); 
foo("5".to_owned()); 

Только типов с явными Drop осущий выполнить эту оценку:

foo(vec![42]); // works 

Drop молча обрабатываются компилятор в фоновом режиме (в противном случае вам придется указывать его везде). Это означает, что в качестве обходного пути можно использовать даже специализацию или OIBIT.

Таким образом, вы можете определить, существует ли какой-либо (даже сгенерированный) drop impl (но не должен), путем преобразования значения типа в объект-признак и проверки того, является ли запись кавычки vtable NULL или нет.

+1

Не совсем верно, что «no type на самом деле не выполняет« Drop »bound» (например, 'Vec ' делает, начиная с Rust 1.15.1), но вы правы, что использование 'Drop' bound не правильный способ обнаружения типа, в котором есть деструктор/клей. –

+0

Да, это странно. Должен прочитать это, спасибо за намек. –

+0

oh ... это любой тип с явным drop impl, который выполняет оценку. –

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

  • Нет связанных вопросов^_^