gpt4 book ai didi

c# - (如何)调试会改变程序的工作流程?

转载 作者:太空狗 更新时间:2023-10-29 23:49:35 25 4
gpt4 key购买 nike

考虑以下简单程序:

var dblMax = Double.MaxValue;

var result = (dblMax * 1000) / 1800;
Console.WriteLine(result);

当我在 Debug模式下构建它并运行 (Ctrl+F5) 或调试 (F5) 时,它会打印 9.987140856842E+307

当我切换到 Release 模式并运行 (Ctrl+F5) 它时,它会打印 8 表示无穷大。

我知道这种差异是由于在 Release模式下进行的一些编译器优化造成的。

但是,如果我在 Release模式下调试 (F5) 相同的构建,它会再次打印 9.987140856842E+307!

我正在调试的事实如何改变计算结果?

编辑:

我不问为什么 Debug模式和 Release模式会产生不同的结果。我想知道为什么 Release模式会根据我是否调试 (F5) 或不调试 (Ctrl+F5) 产生不同的结果。

最佳答案

调试 JITter 时表现不同。

一方面,在许多情况下,局部变量的生命周期会发生变化以便于检查。考虑在计算期间使用变量后设置断点。如果 JITter 知道变量不会在表达式之后使用,并且它不会延长变量的生命周期,那么您最终可能无法查看该变量,这是调试的核心功能。

JITer 非常清楚什么时候变量仍然有用。如果在此期间有一个寄存器可用,它可能最终会使用该寄存器来存储变量。

但是,在附加调试器的情况下,它可能会决定改用内存位置,因为生命周期发生了很大变化,以至于该部分代码无法使用寄存器。

CPU 的浮点寄存器比相应的浮点存储格式精度更高,这意味着一旦你将一个值从寄存器中提取到内存中,或者只是一直存储在内存中,你会体验到较低的精度。

RELEASE 和 DEBUG 构建之间的差异最终会决定这些事情,调试器的存在也是如此。

此外,不同的 .NET 运行时版本之间可能存在差异,这可能会影响这一点。


正确编写浮点代码需要深入了解您正在尝试做什么以及机器和平台的各个部分将如何干扰。我会尽量避免编写这样的代码。

关于c# - (如何)调试会改变程序的工作流程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43255988/

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