1. ホーム
  2. c#

C#/.NETでポインターを使うのはどんなとき?

2023-08-16 21:53:16

質問

C#はプログラマに安全でないコンテキストでポインタにアクセスし、使用する能力を与えることは知っています。しかし、これはいつ必要なのでしょうか?

どのような状況で、ポインタの使用が避けられなくなるのでしょうか?

それはパフォーマンス上の理由だけですか?

また、なぜC#はこの機能を安全でないコンテキストを通して公開し、そこから管理された利点のすべてを取り除くのでしょうか?理論的には、マネージド環境の利点を失うことなく、ポインターを使用することは可能なのでしょうか?

どのように解決するのですか?

<ブロッククオート

どのような場合に必要なのでしょうか?どのような場合にポインタの利用が避けられなくなるのでしょうか?

管理された安全なソリューションの純費用は受け入れがたいが、安全でないソリューションの純費用は受け入れられる場合。正味コストまたは正味利益は、総コストから総利益を差し引くことによって決定できます。安全でないソリューションの利点は、「正しさを保証するための不要な実行時チェックに時間を浪費しない」ことです。コストは、(1)管理された安全システムをオフにしても安全なコードを書かなければならない、(2)管理外のポインターを持つメモリを移動できないため、ガベージコレクターの効率が悪くなる可能性に対処しなければならない、などです。

あるいは、あなたがマーシャリング層を書く人である場合。

パフォーマンス上の理由だけでしょうか?

パフォーマンス以外の理由でマネージド言語でポインタを使用するのは曲者だと思います。

大多数の場合、非マネージドコードとの相互運用に対処するためにマーシャルクラスのメソッドを使用することができます。(相互運用の問題を解決するためにマーシャルギアを使用することが困難であるか不可能であるケースがいくつかあるかもしれませんが、私はそのようなケースを知りません)。

もちろん、私が言ったように、もしあなたがマーシャルクラスを書いている人であれば、明らかにあなたは を使用します。 を使用することはできません。その場合、ポインターを使用して実装する必要があります。

なぜC#はこの機能を安全でないコンテキストを通して公開し、そこから管理された利点のすべてを取り除くのでしょうか?

これらの管理された利点は、パフォーマンスの代償を伴います。例えば、配列に10番目の要素を要求するたびに、ランタイムは10番目の要素があるかどうかを確認し、ない場合は例外を投げる必要があります。ポインターを使えば、そのようなランタイムコストは不要になります。

対応する開発者のコストは、もしあなたがそれを間違って行った場合、エラーの時点できれいな例外を扱うのではなく、1時間後にハードディスクをフォーマットしてプロセスをクラッシュさせるメモリ破損のバグを扱うようになることです。

理論的には、マネージド環境の利点を失うことなくポインターを使用することは可能でしょうか?

利点とは、ガベージコレクション、型安全性、参照整合性などの利点を意味するものと思われます。したがって、あなたの質問は本質的に、「安全システムをオフにしても、安全システムがオンになっていることの利点を得ることは理論的に可能か」ということです。もし、安全システムが高価なのが気に入らないという理由でそれをオフにしたら、安全システムがオンであることの利点は得られません!