C#/.NETでポインターを使うのはどんなとき?
質問
C#はプログラマに安全でないコンテキストでポインタにアクセスし、使用する能力を与えることは知っています。しかし、これはいつ必要なのでしょうか?
どのような状況で、ポインタの使用が避けられなくなるのでしょうか?
それはパフォーマンス上の理由だけですか?
また、なぜC#はこの機能を安全でないコンテキストを通して公開し、そこから管理された利点のすべてを取り除くのでしょうか?理論的には、マネージド環境の利点を失うことなく、ポインターを使用することは可能なのでしょうか?
どのように解決するのですか?
<ブロッククオートどのような場合に必要なのでしょうか?どのような場合にポインタの利用が避けられなくなるのでしょうか?
管理された安全なソリューションの純費用は受け入れがたいが、安全でないソリューションの純費用は受け入れられる場合。正味コストまたは正味利益は、総コストから総利益を差し引くことによって決定できます。安全でないソリューションの利点は、「正しさを保証するための不要な実行時チェックに時間を浪費しない」ことです。コストは、(1)管理された安全システムをオフにしても安全なコードを書かなければならない、(2)管理外のポインターを持つメモリを移動できないため、ガベージコレクターの効率が悪くなる可能性に対処しなければならない、などです。
あるいは、あなたがマーシャリング層を書く人である場合。
パフォーマンス上の理由だけでしょうか?
パフォーマンス以外の理由でマネージド言語でポインタを使用するのは曲者だと思います。
大多数の場合、非マネージドコードとの相互運用に対処するためにマーシャルクラスのメソッドを使用することができます。(相互運用の問題を解決するためにマーシャルギアを使用することが困難であるか不可能であるケースがいくつかあるかもしれませんが、私はそのようなケースを知りません)。
もちろん、私が言ったように、もしあなたがマーシャルクラスを書いている人であれば、明らかにあなたは を使用します。 を使用することはできません。その場合、ポインターを使用して実装する必要があります。
なぜC#はこの機能を安全でないコンテキストを通して公開し、そこから管理された利点のすべてを取り除くのでしょうか?
これらの管理された利点は、パフォーマンスの代償を伴います。例えば、配列に10番目の要素を要求するたびに、ランタイムは10番目の要素があるかどうかを確認し、ない場合は例外を投げる必要があります。ポインターを使えば、そのようなランタイムコストは不要になります。
対応する開発者のコストは、もしあなたがそれを間違って行った場合、エラーの時点できれいな例外を扱うのではなく、1時間後にハードディスクをフォーマットしてプロセスをクラッシュさせるメモリ破損のバグを扱うようになることです。
理論的には、マネージド環境の利点を失うことなくポインターを使用することは可能でしょうか?
利点とは、ガベージコレクション、型安全性、参照整合性などの利点を意味するものと思われます。したがって、あなたの質問は本質的に、「安全システムをオフにしても、安全システムがオンになっていることの利点を得ることは理論的に可能か」ということです。もし、安全システムが高価なのが気に入らないという理由でそれをオフにしたら、安全システムがオンであることの利点は得られません!
関連
-
[解決済み】Unity 「関連するスクリプトを読み込むことができません」「Win32Exception: システムは指定されたファイルを見つけることができません"
-
[解決済み】Linq 構文 - 複数列の選択
-
[解決済み] static_cast, dynamic_cast, const_cast, reinterpret_cast はいつ使うべきですか?
-
[解決済み] .NETでのdecimal, float, doubleの違い?
-
[解決済み] スマートポインターとは何ですか?
-
[解決済み] IDisposable インターフェースの正しい使用法
-
[解決済み] なぜ、オブジェクトそのものではなく、ポインタを使用しなければならないのですか?
-
[解決済み] async」と「await」の使い方とタイミング
-
[解決済み] .NETでC#オブジェクトをJSON文字列に変換するには?
-
[解決済み] LINQで.Firstと.FirstOrDefaultを使用するタイミングは?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】GDI+、JPEG画像をMemoryStreamに変換する際にジェネリックエラーが発生しました。
-
[解決済み】コンパイルエラー「未割り当てのローカル変数を使用しています」が発生したのはなぜですか?
-
[解決済み】Ajax処理で「無効なJSONプリミティブ」と表示される件
-
[解決済み】スクリプトクラスが見つからないので、スクリプトコンポーネントを追加できない?
-
[解決済み】ここで「要求URIに一致するHTTPリソースが見つかりませんでした」となるのはなぜですか?
-
解決済み] Critical error detected c0000374 - C++ dll returns pointer off allocated memory to C# [解決済み] Critical error detected c0000374 - C++ dll returns pointer off allocated memory to C#.
-
[解決済み】バックスラッシュを含むパス文字列のエスケープシーケンスが認識されない件
-
[解決済み】WPFでXamlファイルにコメントを追加する方法は?
-
[解決済み] EntityTypeにキーが定義されていないエラー
-
[解決済み】WSACancelBlockingCallの例外について