gpt4 book ai didi

c# - 安全代码中的不安全标签

转载 作者:行者123 更新时间:2023-12-03 19:16:07 25 4
gpt4 key购买 nike

我正在帮助的项目中有一个人将 unsafe 标记放在性能重要代码的任何地方,无论是否需要。通常这个标签可以安全地移除,但不幸的是很难证明他不应该那样做。谁能给我一篇好的权威文章,证明我或他的观点,这样我们就可以最终结束这个问题了?

他使用 unsafe 的代码示例:

            unsafe
{
writeableBmp.CopyPixels(new Int32Rect(1, 0, (int)(width - 1), (int)height - 1), buffer, writeableBmp.BackBufferStride, 0);
writeableBmp.Lock();
writeableBmp.WritePixels(new Int32Rect(0, 0, (int)width - 1, (int)height - 1), buffer, writeableBmp.BackBufferStride, 0, 0);
writeableBmp.AddDirtyRect(new Int32Rect(0, 0, (int)width - 1, (int)height - 1));
writeableBmp.Unlock();
}

他的观点是,他在某处读到需要 unsafe,并通过向编译器提示代码段应该以不同方式编译来提高性能。

最佳答案

嗯根据http://msdn.microsoft.com/en-us/library/t2yzs44b.aspx不安全只会创建不安全的上下文。这仅在使用指针算法等时才需要,这被认为是不安全的,因此需要创建不安全的上下文。

在任何其他情况下,它根本不会受益,因为它不会禁用任何东西。

使用和不使用代码分析代码或检查 MSIL 以证明这一点。

去掉就行了,如果有不安全的代码,编译器会告诉你的。

一些方法:

using System.Threading.Tasks;
using System.Xml;
using System.Xml.Linq;
using System.Xml.Serialization;

namespace CSharpTestbench
{
class Program
{
static void Main(string[] args)
{

int x = 42;
if (x == 42)
{
Console.WriteLine("it is 42");
}
}
}
}

以这种方式查看未优化的 MSIL 代码:

.method private hidebysig static void  Main(string[] args) cil managed
{
.entrypoint
// Code size 30 (0x1e)
.maxstack 2
.locals init ([0] int32 x,
[1] bool CS$4$0000)
IL_0000: nop
IL_0001: ldc.i4.s 42
IL_0003: stloc.0
IL_0004: ldloc.0
IL_0005: ldc.i4.s 42
IL_0007: ceq
IL_0009: ldc.i4.0
IL_000a: ceq
IL_000c: stloc.1
IL_000d: ldloc.1
IL_000e: brtrue.s IL_001d
IL_0010: nop
IL_0011: ldstr "it is 42"
IL_0016: call void [mscorlib]System.Console::WriteLine(string)
IL_001b: nop
IL_001c: nop
IL_001d: ret
} // end of method Program::Main

用不安全的结果装饰它:

.method private hidebysig static void  Main(string[] args) cil managed
{
.entrypoint
// Code size 32 (0x20)
.maxstack 2
.locals init ([0] int32 x,
[1] bool CS$4$0000)
IL_0000: nop
IL_0001: nop
IL_0002: ldc.i4.s 42
IL_0004: stloc.0
IL_0005: ldloc.0
IL_0006: ldc.i4.s 42
IL_0008: ceq
IL_000a: ldc.i4.0
IL_000b: ceq
IL_000d: stloc.1
IL_000e: ldloc.1
IL_000f: brtrue.s IL_001e
IL_0011: nop
IL_0012: ldstr "it is 42"
IL_0017: call void [mscorlib]System.Console::WriteLine(string)
IL_001c: nop
IL_001d: nop
IL_001e: nop
IL_001f: ret
} // end of method Program::Main

当然,两者都是用/unsafe 编译的。实际上,不安全代码有更多的指令,这些指令会产生稍大的可执行文件,但应该可以忽略不计。不安全的调用只是替换为 NOP CIL 指令,字面上“什么都不做”期望增加可执行文件的大小 (http://en.wikipedia.org/wiki/List_of_CIL_instructions)。

它增加了缩进并使代码更难阅读,因为它也暗示存在不安全的代码。

R# 也说这是不必要的。

开发者有什么证据支持这一说法?

关于c# - 安全代码中的不安全标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21525916/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com