gpt4 book ai didi

c# - 为什么代码行为在发布和 Debug模式下不同?

转载 作者:IT王子 更新时间:2023-10-29 03:38:39 24 4
gpt4 key购买 nike

考虑以下代码:

private static void Main(string[] args)
{
var ar = new double[]
{
100
};

FillTo(ref ar, 5);
Console.WriteLine(string.Join(",", ar.Select(a => a.ToString()).ToArray()));
}

public static void FillTo(ref double[] dd, int N)
{
if (dd.Length >= N)
return;

double[] Old = dd;
double d = double.NaN;
if (Old.Length > 0)
d = Old[0];

dd = new double[N];

for (int i = 0; i < Old.Length; i++)
{
dd[N - Old.Length + i] = Old[i];
}
for (int i = 0; i < N - Old.Length; i++)
dd[i] = d;
}

Debug模式下的结果是:100,100,100,100,100。但在 Release模式下它是:100,100,100,100,0。

发生了什么事?

它使用 .NET Framework 4.7.1 和 .NET Core 2.0.0 进行了测试。

最佳答案

这似乎是一个 JIT 错误;我测试过:

// ... existing code unchanged
for (int i = 0; i < N - Old.Length; i++)
{
// Console.WriteLine(i); // <== comment/uncomment this line
dd[i] = d;
}

并添加 Console.WriteLine(i)修复它。唯一的 IL 变化是:

// ...
L_0040: ldc.i4.0
L_0041: stloc.3
L_0042: br.s L_004d
L_0044: ldarg.0
L_0045: ldind.ref
L_0046: ldloc.3
L_0047: ldloc.1
L_0048: stelem.r8
L_0049: ldloc.3
L_004a: ldc.i4.1
L_004b: add
L_004c: stloc.3
L_004d: ldloc.3
L_004e: ldarg.1
L_004f: ldloc.0
L_0050: ldlen
L_0051: conv.i4
L_0052: sub
L_0053: blt.s L_0044
L_0055: ret

对比

// ...
L_0040: ldc.i4.0
L_0041: stloc.3
L_0042: br.s L_0053
L_0044: ldloc.3
L_0045: call void [System.Console]System.Console::WriteLine(int32)
L_004a: ldarg.0
L_004b: ldind.ref
L_004c: ldloc.3
L_004d: ldloc.1
L_004e: stelem.r8
L_004f: ldloc.3
L_0050: ldc.i4.1
L_0051: add
L_0052: stloc.3
L_0053: ldloc.3
L_0054: ldarg.1
L_0055: ldloc.0
L_0056: ldlen
L_0057: conv.i4
L_0058: sub
L_0059: blt.s L_0044
L_005b: ret

看起来完全正确(唯一的区别是额外的 ldloc.3call void [System.Console]System.Console::WriteLine(int32) ,以及 br.s 的不同但等效的目标)。

我怀疑它需要 JIT 修复。

环境:

  • Environment.Version : 4.0.30319.42000
  • <TargetFramework>netcoreapp2.0</TargetFramework>
  • VS:15.5.0 预览版 5.0
  • dotnet --version : 2.1.1

关于c# - 为什么代码行为在发布和 Debug模式下不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47591915/

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