代码之家  ›  专栏  ›  技术社区  ›  Lumpy

安全代码与不安全代码

  •  9
  • Lumpy  · 技术社区  · 16 年前

    读 this question 今天关于安全和不安全的代码,我在 MSDN 但我还是不明白。为什么要在c_中使用指针?这纯粹是为了速度吗?

    4 回复  |  直到 13 年前
        1
  •  23
  •   Keith Adler    16 年前

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

    • API(如John所述)
    • 获取数据的实际内存地址(例如访问内存映射硬件)
    • 访问和修改数据的最有效方法(时间关键性能要求)
        2
  •  5
  •   John Källén    16 年前

    有时,您需要指针来将C连接到底层操作系统或其他本机代码。你强烈反对这样做,因为这样做是“不安全的”(纳奇)。

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

        3
  •  4
  •   Marc Gravell    16 年前

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

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

    例如,我维护了一些序列化代码。写一篇 float 无需使用 BitConverter.GetBytes (每次都创建一个数组)很痛苦-但我可以欺骗:

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

    现在我可以轮班了( >> )等着写 i 比写作容易得多 f 将是(如果我调用 位转换器.getbytes ,另外,我现在通过选择使用shift来控制endianness)。

        4
  •  0
  •   Olly    13 年前

    至少有一个托管的.NET API常常使使用指针变得不可避免。见 SecureString 和 Marshal.SecureStringToGlobalAllocUnicode .

    这个 只有 获取 SecureString 是使用其中一个 Marshal 方法将其复制到非托管内存。