どちらもC#(危険な)ポインタとC++(生)のポインタは、次のような特徴があります
- 彼らはあなたが与えられたアドレス空間のアドレスを参照することができます。
- 整数でオフセットを含む単純な算術演算(加算と減算)を実行できます。
- 特定のタイプのデータとして指すものを間接参照することができます。
- これらを間違って使用すると、定義されていない動作が起きる可能性があり、正しく使用していることを確認する責任が排他的になります。
その意味で、そして小さな違い(構文、ピン設定など)にかかわらず、C#ポインタとC++ポインタはほとんど同じプログラミングの概念です。したがって、彼らは静的解析にかなり同等に役立ち、したがって、それらは等しく安全であるか安全ではありません。したがって、C#が明示的にこのコンストラクトをunsafe
として呼び出すという事実は、同等のC++構造を「安全」にするものではありません。むしろ、C++では「安全でない」コードを使用する機能が「常にオン」になっています。一例として、
、あなたが範囲外のインデックスを使用してアレイにアクセスしようとする場合を検討:インデクサー構文を使用しているときに例外が発生しますし、あなたが呼び出すC#の配列で
- をポインタとオフセットを使用するときの未定義の動作。
- C++でCスタイルの配列を使用すると、インデクサー構文またはポインターとオフセットのいずれかを使用しているときに、未定義の動作が呼び出されます(これらの2つの構文はCスタイルの配列と同等です)。
- C++ 11
std::array
の場合、array::at
を使用すると例外が発生し、インデクサー構文を使用するときに未定義の動作が呼び出されます。
「安全な」とはどういう意味ですか? –
「安全でない」という定義が何であれ、それがC#ポインタに当てはまる場合は、C++ポインタにも当てはまると確信しています。しかし、C++は、C#のやり方では「安全でない」という明確な概念を持っていません。 –
@BenjaminLindley: 'unsafe'はC#言語のキーワードです。 –