如果C#指针被认为是"不安全的",这是否意味着C++指针也"不安全"?

use*_*285 6 c# c++ arrays pointers unsafe

我正在用C#做一个项目,它可以从线性代数包中受益.我看过那里的那些,但我真的不想付钱,或者我发现它们不是很好.所以我决定写自己的.

我读到C++数组比C#数组快得多,但是在C#中使用指针数组可以获得类似的性能,尽管它们被认为是"不安全的".我很想知道C++指针是如何不同的,如果"不安全"也适用于C++,或者它们是两个根本不同的东西.

The*_*kis 9

C#(不安全)指针和C++(原始)指针都具有以下特征:

  • 它们允许您引用给定地址空间中的地址.
  • 它们允许您对它们执行简单的算术运算(加法和减法),将整数作为偏移量.
  • 它们允许您取消引用它们指向的特定类型的数据.
  • 错误使用它们可以调用未定义的行为,使您完全有责任确保正确使用它们.

从这个意义上说,无论有什么细微差别(如语法,固定等),C#指针和C++指针几乎都是相同的编程概念.因此,它们几乎同样适用于静态分析,因此它们同样安全或不安全.因此,C#显式调用此构造的事实unsafe并不能使等效的C++构造"安全".相反,使用"不安全"代码的能力在C++中"永远在线".

例如,考虑使用超出范围的索引尝试访问数组的情况:

  • 使用C#数组时,在使用索引器语法时会出现异常,并且在使用指针和偏移量时将调用未定义的行为.
  • 使用C++中的C样式数组时,在使用索引器语法或指针和偏移量时将调用未定义的行为(因为这两种语法对于C样式数组是等效的).
  • 使用C++ 11,std::array您将在使用时获得异常,array::at并且在使用索引器语法时将调用未定义的行为.


Mar*_*ica 2

粗略地说(这是一个非常粗略的近似),C#unsafe指针与 C++ 指针是同一类东西。

对于这两种情况,程序员有更多的责任来确保正确,而对于普通的 C#,如果出错,最糟糕的情况就是抛出异常。提供这些保证的运行时检查保证了成本性能,但如果您关闭它们 - 您就得靠自己了。