我正试图通过使用IL代码来改进我的C#数学运算。目前的一个问题是,C#不允许对泛型进行数学运算,但IL允许——至少对于原始数据类型(有趣的是,不允许十进制)。出于这个原因,我在C#中创建了一些测试方法来检查生成的IL代码。以下是C#方法的代码:
public static float Add(float A, float B)
{
return A + B;
}
以下是VS2015SP2/Release+Optimization打开的结果。只是为了确保:这是来自构建的csc命令行:
C: \Program Files(x86)\MSBuild\14.0\bin\csc.exe/noconfig/nowarn:170117022008/nostlib+/平台:anycpu32bit首选/errorreport:prompt/warn:4/define:TRACE/errorendlocation/preferreduilang:en US/hightentropyva+/reference:"C:\Program Files(x86)\参考程序集\Microsoft\Framework.NETFramework\v4.5.2 \Microsoft.CSharp.dll"/reference:"C:\Program Files(x86)\reference程序集\Microsoft\Framework.NETFramework\v4.5.2\mscorlib.dll"/reference:"C:\Program Files(x86)\reference程序集\Microsoft\Framework.NETFramework\v4.5.2 \System.Core.dll"/reference:"C:\Program Files(x86)\reference程序集\Microsoft\Framework.NETFramework\v4.5.2 \System.Data.DataSetExtensions.dll"/reference:"C:\Program Files(x86)\reference程序集\Microsoft\Framework.NETFramework\v4.5.2 \System.Data.dll"/reference:"C:\Program Files(x86)\reference程序集\Microsoft\Framework.NETFramework\v4.5.2 \System.dll"/reference:"C:\Program Files(x86)\reference程序集\Microsoft\Framework.NETFramework\v4.5.2\System.Net.Http.dll"/reference:"C:\Program Files(x86)\reference程序集\Microsoft\Framework.NETFramework\v4.5.2 \System.Xml.dll"/reference:"C:\Program Files(x86)\reference程序集\Microsoft\Framework.NETFramework\v4.5.2 \System.Xml.Linq.dll"/debug-/filealign:512/优化+/out:obj\Release\ConsoleApplication1.exe/ruleset:"C:\Program Files(x86)\Microsoft Visual Studio 14.0\团队工具\静态分析Tools\Rule Sets\MinimumRecommendedRules.ruleset"/子系统版本:6.00/target:exe/utf8output Program.cs属性\AssemblyInfo.csC:\Users\Martin\AppData\Local\Temp.NETFramework,版本=v4.5.2。AssemblyAttributes.csobj\Release \临时生成文件_E7A71F3-0F8D-4B9B-B56E-8E70B10BC5D3.csobj\Release \临时生成文件_036C0B5B-1481-4323-8D20-8F5ADCB23D92.csobj\Release \临时生成文件_5937a6070-0e60-4077-877b-f7221da3dda1.cs(任务ID:27)1>
.method public hidebysig static
float32 Add (
float32 A,
float32 B
) cil managed
{
// Method begins at RVA 0x2054
// Code size 9 (0x9)
.maxstack 2
.locals init (
[0] float32
)
IL_0000: nop
IL_0001: ldarg.0
IL_0002: ldarg.1
IL_0003: add
IL_0004: stloc.0
IL_0005: br.s IL_0007
IL_0007: ldloc.0
IL_0008: ret
} // end of method Program::Add
你知道为什么它仍然没有,为什么有一个局部变量,为什么结尾有一个跳跃,什么都不做吗?
我很清楚,最终的抖动可能会解决这个问题,但如果我看到这个,我不知道,我是否可以相信抖动。
谢谢Martin
恐怕我不能重复您的结果。使用csc/debug-/optimite+编译,然后使用ildasm,我得到:
.method public hidebysig static float32 Add(float32 A,
float32 B) cil managed
{
// Code size 4 (0x4)
.maxstack 8
IL_0000: ldarg.0
IL_0001: ldarg.1
IL_0002: add
IL_0003: ret
} // end of method Program::Add
这就是我对优化代码的期望。事实上,如果我改为优化-,我会得到你发布的代码。您是否正在检查调试与发布子目录?