Результат следующего кода отличается, если он запущен с отладчиком в фоновом режиме или без него. Разница только там, если включена оптимизация.
Вот результат:
-> с оптимизацией: 1000 2008 3016 1001 2009 3007 ...
-> без оптимизации (как и ожидалось) 1000 1008 1016 1001 1009 1017 ...
Код:
using System;
using System.Diagnostics;
using System.Runtime.CompilerServices;
namespace OptimizerTest
{
public class Test
{
int dummy;
public void TestFunction(int stepWidth)
// stepWidth must be a parameter
{
for (int step = 0; step < stepWidth; step++)
{
dummy = step + 1000;
// addition with constant ( same value as later !)
for (int x = 0; x < 20; x += stepWidth)
{
int index = x + 1000 + step;
// constant must be same as above and ?!?!
// int index = x + step + 1000; works !!!!!
Console.Write("\n\r" + index);
}
}
}
[MethodImpl(MethodImplOptions.NoOptimization)]
public void TestFunctionNoOptimization(int stepWidth)
{
for (int step = 0; step < stepWidth; step++)
{
dummy = step + 1000;
for (int x = 0; x < 20; x += stepWidth)
{
int index = x + 1000 + step;
Console.Write("\n\r" + index);
}
}
}
}
class Program
{
/// <summary>
/// Result differs from Start with F5 to Ctrl-F5
/// </summary>
/// <param name="args"></param>
static void Main(string[] args)
{
Test test = new Test();
Console.Write("\n\r---------\n\roptimized result\n\r-------------" );
test.TestFunction(8);
Console.Write("\n\r---------\n\rnot optimized result\n\r-------------");
test.TestFunctionNoOptimization(8);
Console.Write("\n\r---------\n\rpress any key");
Console.ReadKey();
}
}
}
Поведение ошибки зависит от количества итераций внутреннего цикла (x ‹5 все работает нормально). Очень интересно то, что не происходит, когда я использую
int index = x + step + 1000;
вместо
int index = x + 1000 + step;
Я работаю с Visual Studio 2010 SP1 и пробовал его с .NET Framework от 2.0 до 4.0.3. Я всегда видел один и тот же результат.
Кто-нибудь знает об этом баге или может воспроизвести?