【发布时间】:2018-01-11 20:42:21
【问题描述】:
在 C++ 中,编译器优化可能会利用程序中未定义的行为(如有符号整数溢出和取消引用空指针)产生“意外”的程序行为。如果在生产中使用发布版本,那么在发布版本中测试程序很重要。
在 C# 中,未定义的行为很少见。除了
- 不安全的代码
- 多线程计时
- 调试/发布模式启用/禁用代码(例如#if)
优化能否像 C++ 一样产生不同的程序行为?
【问题讨论】:
-
例如在 UWP 项目中,release 中的编译与 debug 中的编译有很大不同(因为 .NET 原生工具链),您应该始终测试 release 版本。还有一些您应该注意的开关,例如
#if DEBUG。我想说,测试发布版本总是一个好习惯。 -
stack may collapse due to optimization。关于tail call optimization 的链接文章提到了各种会阻止优化以防止行为差异的条件,但是如果您的应用在未覆盖的情况下依赖调用堆栈条件,您将获得不同的行为
标签: c# testing compilation release compiler-optimization