c# - 如果 C# 指针被认为是 "unsafe,",这是否意味着 C++ 指针也是 "unsafe"?

标签 c# c++ arrays pointers unsafe

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

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

最佳答案

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

  • 它们允许您引用给定地址空间中的地址。
  • 它们允许您对它们执行简单的算术运算(加法和减法),涉及整数作为偏移量。
  • 它们允许您将它们指向的任何内容取消引用为特定类型的数据。
  • 错误地使用它们会引发未定义的行为,因此确保您正确使用它们是您的全部责任。

从这个意义上说,无论任何细微差异(如语法、固定等),C# 指针和 C++ 指针几乎都是相同的编程概念。因此,它们几乎同样适用于静态分析,因此它们同样安全或不安全。因此,C# 将此构造显式调用为 unsafe 的事实并不会使等效的 C++ 构造“安全”。相反,使用“不安全”代码的能力在 C++ 中“始终开启”。

例如,考虑您尝试使用越界索引访问数组的情况:

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

关于c# - 如果 C# 指针被认为是 "unsafe,",这是否意味着 C++ 指针也是 "unsafe"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37240655/

相关文章:

java - 如何使用 Jersey 将嵌套列表编码为 JSON?我得到一个空值数组或一个包含数组的单元素字典数组

c# - Miniprofiler 在缺少 CreatedOn 列时中断

c# - 具有临时 EntityKey 值的对象不能附加到对象上下文

c# - 将图像移动到背景?

c# - 没有管理用户配置文件权限的 Sharepoint UserProfileManager

c++ - 约瑟夫算法

c++ - 独立于操作系统的清除缓冲区

c++ - sendto 因非管理员用户而失败,错误代码为 10013

Java - 生成特定数字的随机范围而不重复这些数字 - 如何?

javascript - 通过使用 ramda 测试所有其他项目来过滤数组