安全与不安全的代码
今天阅读这个关于安全和不安全代码的问题我然后在MSDN中阅读它,但我仍然不理解它。 你为什么要在C#中使用指针? 这纯粹是为了速度吗?
使用不安全代码有三个原因:
- API(如John所述)
- 获取数据的实际内存地址(例如,访问内存映射硬件)
- 访问和修改数据的最有效方式(时间关键性能要求)
有时您需要指针将C#连接到底层操作系统或其他本机代码。 你强烈反对这样做,因为它“不安全”(natch)。
在一些非常罕见的场合,你的性能是如此受CPU限制,你需要那么微小的额外性能。 我的建议是在汇编程序或C / C ++的单独模块中编写这些CPU-intessive部分,导出API,并让您的.NET代码调用该API。 一个可能的额外好处是,您可以将特定于平台的代码放在非托管模块中,并使.NET平台不可知。
我倾向于避免它,但有时候它非常有帮助:
- 使用原始缓冲区(图形等)的性能
- 一些非托管API需要(对我来说也很少见)
- 用数据作弊
比如最后一个,我维护了一些序列化代码。 将float
写入流而不必使用BitConverter.GetBytes
(每次创建一个数组)是痛苦的 – 但我可以作弊:
float f = ...; int i = *(int*)&f;
现在我可以使用shift( >>
)等来写i
比写f
更容易(如果我调用了BitConverter.GetBytes
,那么字节将是相同的,加上我现在通过我选择使用shift来控制字节序) 。
至少有一个托管的.Net API经常使用指针不可避免。 请参阅SecureString和Marshal.SecureStringToGlobalAllocUnicode 。
获取SecureString
的纯文本值的唯一方法是使用Marshal
方法之一将其复制到非托管内存。