gpt4 book ai didi

C# 编译器优化 - Catch 仅包含 throw

转载 作者:行者123 更新时间:2023-11-30 16:58:19 25 4
gpt4 key购买 nike

我希望 MyMethod 的以下两个实现的行为完全相同。他们呢?如果不是,这可能已经是我的错误假设:

首先:

public int MyMethod(int x)
{
try
{
return x + 8;
}
catch
{
throw;
}
}

第二个:

public int MyMethod(int x)
{
return x + 8;
}

所以,我假设编译器会对此进行优化,即删除第一个实现(在 Release模式下)不必要的 try/catch block 。事实证明,它并没有——这是为两个代码示例生成的 IL:

首先:

.method public hidebysig instance int32  MyMethod(int32 x) cil managed
{
// Code size 11 (0xb)
.maxstack 2
.locals init ([0] int32 CS$1$0000)
.try
{
IL_0000: ldarg.1
IL_0001: ldc.i4.8
IL_0002: add
IL_0003: stloc.0
IL_0004: leave.s IL_0009
} // end .try
catch [mscorlib]System.Object
{
IL_0006: pop
IL_0007: rethrow
} // end handler
IL_0009: ldloc.0
IL_000a: ret
} // end of method MyClass::MyMethod

第二个:

.method public hidebysig instance int32  MyMethod(int32 x) cil managed
{
// Code size 4 (0x4)
.maxstack 8
IL_0000: ldarg.1
IL_0001: ldc.i4.8
IL_0002: add
IL_0003: ret
} // end of method MyClass::MyMethod

有人可以解释一下吗?两种实现的行为是否存在相关差异(副作用?)?编译器可以优化代码,但没有优化吗?谢谢!

最佳答案

大部分优化由 JITter 完成,只有一些优化由生成 IL 的编译器完成。所以我不知道在程序运行期间实际编译成机器代码的是什么(尽管你可以调试)。
您可以在帖子中找到信息:http://blogs.msdn.com/b/ericlippert/archive/2009/06/11/what-does-the-optimize-switch-do.aspx由 c# 编译器团队之一编写。
上面写着:
“/optimize 标志不会改变我们大量的发射和生成逻辑。我们尝试始终生成简单、可验证的代码,然后在生成真正的机器代码时依靠抖动来完成繁重的优化工作”

您还可以在链接中找到一些实际为生成 IL 代码而优化的情况的信息。

更新

有一个关于答案中含义的性能测试:
what will empty catch and throw block do?
它确认它没有被优化掉。

关于是否可以删除代码的问题,在以下位置进行了讨论: Can I remove empty catch with throw?

关于C# 编译器优化 - Catch 仅包含 throw,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25419410/

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