11

安全なコードと安全でないコードについて今日この質問を読んでから、 MSDNで読んだのですが、それでも理解できません。なぜC#でポインターを使用したいのですか?これは純粋に速度のためですか?

4

4 に答える 4

25

安全でないコードを使用する理由は3つあります。

  • API(Johnが指摘)
  • データの実際のメモリアドレスを取得する(たとえば、メモリマップトハードウェアにアクセスする)
  • データにアクセスして変更するための最も効率的な方法(タイムクリティカルなパフォーマンス要件)
于 2010-05-03T20:23:38.723 に答える
5

C#を基盤となるオペレーティングシステムまたは他のネイティブコードにインターフェイスするためのポインターが必要になる場合があります。それは「安全ではない」(ナッチ)ので、そうすることを強くお勧めしません。

非常にまれに、パフォーマンスがCPUに制限されているため、ごくわずかな追加のパフォーマンスが必要になる場合があります。私の推奨は、これらのCPUに依存しない部分を、アセンブラーまたはC / C ++の別のモジュールに記述し、APIをエクスポートして、.NETコードにそのAPIを呼び出させることです。考えられる追加の利点は、プラットフォーム固有のコードをアンマネージモジュールに配置し、.NETプラットフォームに依存しないようにすることができることです。

于 2010-05-03T20:20:57.553 に答える
4

私はそれを避ける傾向がありますが、それが非常に役立つ場合があります:

  • 生のバッファ(グラフィックスなど)を使用したパフォーマンス用
  • 一部のアンマネージAPIに必要(私にとっても非常にまれです)
  • データを使った不正行為

最後の例として、私はいくつかのシリアル化コードを維持しています。(毎回配列を作成する)floatを使用せずにストリームにaを書き込むのは面倒ですが、チートすることはできます。BitConverter.GetBytes

float f = ...;
int i = *(int*)&f;

これで、shift(>>)などを使用して、書き込むiよりもはるかに簡単に書き込むfことができます(バイトは、を呼び出した場合と同じになりますBitConverter.GetBytes。さらに、shiftの使用方法によってエンディアンを制御します)。

于 2010-05-03T20:28:22.037 に答える
0

ポインタの使用を避けられないことが多いマネージド.NetAPIが少なくとも1つあります。SecureStringおよびMarshal.SecureStringToGlobalAllocUnicodeを参照してください。

aのプレーンテキスト値を取得する唯一SecureStringの方法は、いずれかのMarshal方法を使用して、それをアンマネージメモリにコピーすることです。

于 2012-12-13T16:29:02.070 に答える