2016-05-15 19 views
4

私は線形代数パッケージの恩恵を受ける可能性のあるC#でプロジェクトを行っています。私はそこにいる人を見ましたが、私は本当に支払っていない、または私はそれらがあまり良くないことがわかりました。だから私は自分自身を書くことに決めました。C#ポインタが「安全でない」と考えられる場合、C++ポインタも「安全でない」ことを意味しますか?

C++配列はC#配列よりもはるかに高速ですが、C#でポインタ配列を使用して同様のパフォーマンスを得ることは可能でしたが、安全ではないと考えられています。私はC++ポインタがどのように異なっているのか、C++にも「安全でないもの」が当てはまるのか、それとも根本的に異なる2つのものであるのかを知りたいのです。

+4

「安全な」とはどういう意味ですか? –

+0

「安全でない」という定義が何であれ、それがC#ポインタに当てはまる場合は、C++ポインタにも当てはまると確信しています。しかし、C++は、C#のやり方では「安全でない」という明確な概念を持っていません。 –

+0

@BenjaminLindley: 'unsafe'はC#言語のキーワードです。 –

答えて

2

おおまかに言えば(それは非常に粗近似です)、C#unsafeポインタはC++ポインタと同じ種類のものです。

プログラマーには、それを正しく行う責任がありますが、通常のC#では、間違っていると例外がスローされます。これらの保証を実行するランタイムチェックではコストパフォーマンスが向上しますが、それらをオフにすると、あなた自身で実行されます。

2

unsafeは、必ずしも割り当てられなかったメモリへのアクセスを.Netが許可することを意味します。バインドされたチェックはオフになっており、JITコンパイラでいくつかの最適化が可能です。

通常、ポインタはC++で同じです。つまり、メモリの任意の領域にアクセスできるようになります。 バインドチェックと演算子のオーバーロードを実装できますが、ポインタのデフォルトではありません。

2

特に、C#で安全でないのは、管理対象のサンドボックスから抜け出し、ネイティブコードを実行できることです。これは、マネージコードが管理されていないクラッシュを生成する可能性があることを意味します。これは完全な信頼がないと安全でないコードが許可されない理由です(ただし、おそらく部分的な信頼コードを処理する必要はありません)。

おそらく、C#でint *を使用してアンマネージコードを実行する方法について考えていることでしょう。簡単に:スタックを慎重にスタックする。それをスタック上の整数のアドレスに割り当て、ネイティブコードを含むバイト配列のアドレスを次のいくつかの整数に書き込みます。

9

どちらもC#(危険な)ポインタとC++(生)のポインタは、次のような特徴があります

  • 彼らはあなたが与えられたアドレス空間のアドレスを参照することができます。
  • 整数でオフセットを含む単純な算術演算(加算と減算)を実行できます。
  • 特定のタイプのデータとして指すものを間接参照することができます。
  • これらを間違って使用すると、定義されていない動作が起きる可能性があり、正しく使用していることを確認する責任が排他的になります。

その意味で、そして小さな違い(構文、ピン設定など)にかかわらず、C#ポインタとC++ポインタはほとんど同じプログラミングの概念です。したがって、彼らは静的解析にかなり同等に役立ち、したがって、それらは等しく安全であるか安全ではありません。したがって、C#が明示的にこのコンストラクトをunsafeとして呼び出すという事実は、同等のC++構造を「安全」にするものではありません。むしろ、C++では「安全でない」コードを使用する機能が「常にオン」になっています。一例として、

、あなたが範囲外のインデックスを使用してアレイにアクセスしようとする場合を検討:インデクサー構文を使用しているときに例外が発生しますし、あなたが呼び出すC#の配列で

  • をポインタとオフセットを使用するときの未定義の動作。
  • C++でCスタイルの配列を使用すると、インデクサー構文またはポインターとオフセットのいずれかを使用しているときに、未定義の動作が呼び出されます(これらの2つの構文はCスタイルの配列と同等です)。
  • C++ 11 std::arrayの場合、array::atを使用すると例外が発生し、インデクサー構文を使用するときに未定義の動作が呼び出されます。
+0

あなたの最初の箇条書きは、 * dynamic *キーワードやReflectionは、C#コンパイラでも静的に検証することはできません。それは、その仕事をすることができないCLRに組み込まれた検証者です。 –