我对CLR的优化器有点失望。假设我有以下代码:
int i = 0;
for (int j = 0; j < 10; ++j)
++i;
Console.WriteLine("{0}", i);
很明显,在循环结束时,局部变量'i'应该具有值10.现代C ++编译器会优化这段代码:
Console.WriteLine("{0}", 10);
令我惊讶的是,CLR JIT编译器看起来并不那么聪明。当我编译上面的代码时,它迭代10次而不是直接赋值。多线程在这里没有问题,因为所有数据访问都在堆栈上,因此特定于线程。
有人可以指出CLR优化器有多聪明吗?当编译器没有优化对变量/字段的访问时,我没有看到volatile
关键字的用法。