lot*_*har 9

不仅编译器可以重新排序执行(主要用于优化),大多数现代处理器也这样做.阅读有关执行重新排序和内存障碍的更多信息.


Hex*_*gon 5

当编译认为适合于优化目的时,编译器可以更改语句的执行顺序,并且当这些更改不会改变代码的可观察行为时.

一个非常简单的例子 -

int func (int value)
{
    int result = value*2;
    if (value > 10)
    {
       return result;
    }
    else
    {
       return 0;
    }
}
Run Code Online (Sandbox Code Playgroud)

一个天真的编译器可以完全按照所示的顺序为此生成代码.首先计算"结果"并仅在原始值大于10时返回(如果不是,则"结果"将被忽略 - 不必要地计算).

但是,一个理智的编译器会发现只有当"value"大于10时才需要计算"result",因此可以很容易地将计算"value*2"移到第一个大括号内,只有在"value"时才会这样做实际上大于10(不用说,编译器在优化时并不真正看C代码 - 它在较低级别工作).

这只是一个简单的例子.可以创建更复杂的示例.C函数很可能最终看起来几乎没有像编译形式的C表示那样,具有足够激进的优化.