安全なコードと安全でないコードについて今日この質問を読んでから、 MSDNで読んだのですが、それでも理解できません。なぜC#でポインターを使用したいのですか?これは純粋に速度のためですか?
4 に答える
安全でないコードを使用する理由は3つあります。
- API(Johnが指摘)
- データの実際のメモリアドレスを取得する(たとえば、メモリマップトハードウェアにアクセスする)
- データにアクセスして変更するための最も効率的な方法(タイムクリティカルなパフォーマンス要件)
C#を基盤となるオペレーティングシステムまたは他のネイティブコードにインターフェイスするためのポインターが必要になる場合があります。それは「安全ではない」(ナッチ)ので、そうすることを強くお勧めしません。
非常にまれに、パフォーマンスがCPUに制限されているため、ごくわずかな追加のパフォーマンスが必要になる場合があります。私の推奨は、これらのCPUに依存しない部分を、アセンブラーまたはC / C ++の別のモジュールに記述し、APIをエクスポートして、.NETコードにそのAPIを呼び出させることです。考えられる追加の利点は、プラットフォーム固有のコードをアンマネージモジュールに配置し、.NETプラットフォームに依存しないようにすることができることです。
私はそれを避ける傾向がありますが、それが非常に役立つ場合があります:
- 生のバッファ(グラフィックスなど)を使用したパフォーマンス用
- 一部のアンマネージAPIに必要(私にとっても非常にまれです)
- データを使った不正行為
最後の例として、私はいくつかのシリアル化コードを維持しています。(毎回配列を作成する)floatを使用せずにストリームにaを書き込むのは面倒ですが、チートすることはできます。BitConverter.GetBytes
float f = ...;
int i = *(int*)&f;
これで、shift(>>)などを使用して、書き込むiよりもはるかに簡単に書き込むfことができます(バイトは、を呼び出した場合と同じになりますBitConverter.GetBytes。さらに、shiftの使用方法によってエンディアンを制御します)。
ポインタの使用を避けられないことが多いマネージド.NetAPIが少なくとも1つあります。SecureStringおよびMarshal.SecureStringToGlobalAllocUnicodeを参照してください。
aのプレーンテキスト値を取得する唯一SecureStringの方法は、いずれかのMarshal方法を使用して、それをアンマネージメモリにコピーすることです。