0

我对 JIT 优化有疑问。我编译了一段简单的代码:

class btest
{
        static final boolean flag=false;

        public final void foo(int x)
        {
                if(flag) {a=x; b=x*2; c=x*3;}
        }

        public void bar(int y)  {foo(y);}

        int a,b,c;
};

flag设置为falsesofoo()完美编译为空代码 - 只是返回。但bar()还是叫它。

JIT 是否有可能消除这个调用?是否flag属于外部类有关系吗?

问候

4

2 回答 2

4

它可以消除它并将其内联在代码中。

注意:它也可以对它认为线程不会更改值的非易失性非最终变量执行此操作。一个常见的错误是

boolean running = true;

public void run() {
     while(running) {
        // do something
     }
}

public void stop() {
     running = false;
}

一个常见的误解是线程可能会继续运行一段时间,但会在某个未知点停止,而实际上 JIT 可能会内联running并且永远不会停止。

于 2013-07-19T14:45:54.887 回答
1

JIT 编译器很可能能够消除这种情况。

但实际上,我认为该if声明很可能在此之前被优化掉。原因是在JLS 14.21中,从 is 这样说的地方开始:

“但是,为了方便将 if 语句用于‘条件编译’目的,实际规则有所不同。”

如果继续说编译器(即字节码编译器!)可能会根据编译时条件的已知值在您的示例中生成不同的代码。

请注意,这种特殊处理仅适用于if语句,并且仅当条件是常量表达式时。(该术语具有非常特定的含义 - 请参阅JLS 15.28)例如,如果您尝试使用循环使用相同的“技巧” while,您会收到一个编译错误,抱怨无法访问代码。

(这种“条件编译”的特殊处理可以追溯到 Java 的早期,并且是 Gosling等人决定不在 Java 语言中包含预处理器的部分理由。)

于 2013-07-19T14:58:46.930 回答