11

今天阅读这个关于安全和不安全代码的问题,然后我在MSDN中阅读了它,但我仍然不明白。为什么要在 C# 中使用指针?这纯粹是为了速度吗?

4

4 回答 4

25

使用不安全代码的三个原因:

  • API(如 John 所述)
  • 获取数据的实际内存地址(例如访问内存映射硬件)
  • 访问和修改数据的最有效方式(时间关键的性能要求)
于 2010-05-03T20:23:38.723 回答
5

有时您需要将 C# 接口连接到底层操作系统或其他本机代码的指针。强烈建议您不要这样做,因为它是“不安全的”(natch)。

在一些非常罕见的情况下,您的性​​能受 CPU 限制如此之大,以至于您需要那微不足道的额外性能。我的建议是在汇编程序或 C/C++ 的单独模块中编写这些 CPU 密集型部分,导出 API,并让您的 .NET 代码调用该 API。一个可能的额外好处是您可以将特定于平台的代码放在非托管模块中,并使 .NET 平台不可知。

于 2010-05-03T20:20:57.553 回答
4

我倾向于避免它,但有时它非常有用:

  • 用于处理原始缓冲区(图形等)的性能
  • 一些非托管 API 需要(对我来说也很少见)
  • 用数据作弊

例如最后一个,我维护一些序列化代码。将 a 写入float流而不必使用BitConverter.GetBytes(每次都会创建一个数组)是痛苦的 - 但我可以作弊:

float f = ...;
int i = *(int*)&f;

现在我可以使用 shift ( >>) 等比编写i更容易编写f(字节将与我调用时相同,BitConverter.GetBytes而且我现在通过选择使用 shift 的方式来控制字节序)。

于 2010-05-03T20:28:22.037 回答
0

至少有一个托管的 .Net API 通常使使用指针不可避免。请参阅SecureStringMarshal.SecureStringToGlobalAllocUnicode

获取 a 的纯文本值的唯一方法SecureString是使用其中一种Marshal方法将其复制到非托管内存。

于 2012-12-13T16:29:02.070 回答