2017-02-20 7 views
7

Vecなどの型がtruncateになると、ベクトルの各メンバーにptr::drop_in_placeが呼び出されます。タイプに「ドロップ」が必要な場合の検出方法

これは、int、floatなどのプリミティブ型のパフォーマンス上の問題ではないことが判明しました。なぜなら、ドロップ呼び出しが最適化されているからです。

もっと複雑なコンテナタイプ(自分で使用するために書いたもの)の場合、要素を反復することはそれほど簡単ではない(常に最適化されるとは限りません)

タイプにドロップ特性があるかどうかをチェックする方法はありますか?その場合、すべてのメンバーにアクセスすることはできませんか?

答えて

5

std::intrinsics::needs_dropはまだ不安ですが、それに対処できれば、これを確認するのが最良の方法です。

+0

あなたがリンクしているドキュメントの記述は、すべてのタイプがドロップグルーが必要か_implement Copy_のいずれかであることを暗示しているようです。これは正しいとは言えません。 –

+0

@PeterHallそれは、すべての型がこれらの事柄のうちの1つを行うことを暗示するものではなく、実際にどちらの型も明示的に言及していません。 'Drop'または' Drop'(ドロップのりを持つための基準は) 'Copy'になることはありませんされているものが含まれている自身あるタイプ - しかし、であること' Copy'がドロップ接着剤を有する相互に排他的であることを確かに真実です。 – delnan

3

Dropについては、一般的な範囲では推論できません。

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

Drop

は静かで処理されます。このバウンド果たす明示 Drop IMPLで

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

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

のみのタイプ:明示的なDropのimplを持っていないタイプは、Drop拘束を満たしていませんコンパイラをバックグラウンドで実行します(そうしないと、どこにでも指定する必要があります)。これは、特殊化やOIBITを使用しても回避策として使用できないことを意味します。

これは、タイプの値を特性オブジェクトに変換し、vtableのドロップエントリがNULLであるかどうかをチェックすることで、(たとえ生成すべきでない)ドロップインプットが存在するかどうかを検出できます。

+1

「型は実際には 'Drop' boundを実現していません(例えばRust 1.15.1の' Vec 'はそうです)。しかし、' Drop'バインドを使うのは正しいですデストラクタ/ドロップグルーを持つ型を検出する正しい方法ではありません。 –

+0

ええ、それは変です。それを読んでみると、ヒントのおかげで。 –

+0

ああ...これは、明示的なドロップインプットを持つ任意のタイプで、バインディングを満たしています。 –

関連する問題