2016-04-10 13 views
3

モチベーションは、私が空ポインタを使って何かを渡すC APIでコールバックを使用しようとしています。迅速なポインタのキャストと強制の違いは何ですか?

私はx: UnsafePointer<Void>があるとします。私はそれが実際にだから、私は適切にポインタを変換したい知っている。 unsafeBitCastの使用と、UnsafePointerをxに適用するだけの違いは何ですか?言い換えれば

は、何らかの方法で

let z = UnsafePointer<MyStruct>(x) 

異なる

let y = unsafeBitCast(x, to: UnsafePointer<MyStruct>.self) 

ですか?

+0

C APIを使用するために、非常に薄いSwiftレイヤーにC APIをラップすると良いでしょう。このレイヤーでは、Swift値へのvoidポインターからのこの安全でないマッピングを行います。コードの残りの部分はSwiftコードを通り、コードベースはこの非常に不安定なコードではぎとられません。すべてが単一のラッパーコードにまとめられています。 – nhgrif

答えて

2

unsafeBitCast同じサイズの2つのSwiftタイプの間の変換は安全です。つまり、unsafeBitCast(x, UnsafePointer<MyStruct>.self)と書くことができますが、unsafeBitCast(x, MyClass.self)またはunsafeBitCast(x, Int.self)と書くこともできます。これは一般的に非常に安全ではありません。なぜなら、Swiftはそのタイプのメモリレイアウトについて多くのことを保証していないからです。あなたのケースでは、UnsafePointerまたはUnmanagedを使用する方が良い選択肢かもしれません。

「強制」UnsafePointer<MyStruct>(x)は実際に特殊な言語機能ではなく、別のUnsafePointerをとるan UnsafePointer initializerです。その効果は、Cでのポインタ型(またはC++でのstatic_cast)間のキャストと同様に、異なる型と同じメモリアドレスの値を再解釈することです。 2つのSwiftタイプ(UnsafePointerの2つのバリエーション)の間の変換は安全ですが、もちろんそれらはまだです安全でないポインタ、あなたは正しくメモリにアクセスしていることを確認する必要があります。依然として割り当てと割り当て解除の責任はあなたにあります。

+0

つまり、 'UnsafePointer'の' memory'プロパティにアクセスすると、あなたは 'unsafeBitCast'を持っているのと同じ位置にいるのでしょうか? – nhgrif

+0

はい、そうです。 – jtbandes

+0

2つの間にパフォーマンスの影響はありますか?彼らはどちらも効果的に無料ですか? – Redoubts

関連する問題