program tip

자바 : for (;;) 대 while (true)

radiobox 2020. 12. 3. 07:44
반응형

자바 : for (;;) 대 while (true)


표준 while(true)루프와 의 차이점은 무엇입니까 for(;;)?

컴파일 후 동일한 바이트 코드에 매핑되거나 둘 다 매핑됩니까?


의미 적으로는 완전히 동일합니다. 맛의 문제지만 while(true)깔끔해 보이고 언뜻보기에 읽기 쉽고 이해하기 쉽다고 생각 합니다. Java에서는 둘 다 컴파일러 경고를 일으키지 않습니다.

바이트 코드 수준에서는 컴파일러와 최적화 수준에 따라 달라질 수 있지만 원칙적으로 내 보낸 코드는 동일해야합니다.

편집하다:

내 컴파일러에서 Bytecode Outline 플러그인을 사용하면 바이트 코드는 for(;;){}다음과 같습니다.

   L0
    LINENUMBER 6 L0
   FRAME SAME
    GOTO L0

그리고에 대한 바이트 코드는 while(true){}다음과 같습니다.

   L0
    LINENUMBER 6 L0
   FRAME SAME
    GOTO L0

그래서 예, 적어도 저에게는 동일합니다.


어느 것을 사용할지는 당신에게 달려 있습니다. 컴파일러와 같기 때문입니다.

파일 생성 :

// first test
public class Test {
    public static void main(String[] args) {
        while (true) {
            System.out.println("Hi");
        }
    }
}

엮다:

javac -g:none Test.java
rename Test.class Test1.class

파일 생성 :

// second test
public class Test {
    public static void main(String[] args) {
        for (;;) {
            System.out.println("Hi");
        }
    }
}

엮다:

javac -g:none Test.java
mv Test.class Test2.class

비교:

diff -s Test1.class Test2.class
Files Test1.class and Test2.class are identical

동일한 바이트 코드로 컴파일되며 선호하는 구성은 취향의 문제입니다.

나는 오라클이 배포 한 JDK에서 많은 소스 코드를 읽었고, while(true)그들의 코드에서 문장을 보았다는 것을 쉽게 기억할 수 없지만 그들의 코드에서 많은 for(;;)문장을 보았다 . 나 개인적으로 나는 찬성 for(;;)하며 내 추론은 다음과 같이 약간 진행됩니다.

while-loop는 부울 상수가 아니라 부울 표현식을 "반드시"필요합니다. while(true)if(true)두 가지 모두 대중의 편의를 위해서만 합법화되었다고 생각합니다. 비어있는 while()것은 컴파일되지 않습니다. true거기에 추가하는 것은 해킹과 같은 느낌입니다.

for(;;) on the other hand is a "real loop", albeit an empty one. Also, it saves you a couple of keystrokes! =) (not that it matter)

Therefore, and I know it sounds crazy, but although while(true) reads better in English, I think for(;;) better express your intent and is more akin to the Java programming language. Eternal loops should be avoided anyways. When I read for(;;), I feel secure knowing the developer will brake the execution path somewhere. When I read while(true), I just cannot be that sure anymore. But hey, maybe that's just me! We're all free to pick our own flavor.


On Oracle Java 7 you get the same byte code. You cannot tell from the byte code which was using in the original. Which is best is a matter of taste. I use while(true)


Depending upon the compiler, it should map to the same byte code.


JVM will find the best way to make bytecode and in both cases should do the same.So I think there's no difference. while(true) is just prettier.


I have looked at the generated byte code and found that since the condition is always true (at compile time), the compiler will compile away the test and just branch always back to the top of the loop. I assume that a continue statement will also do a branch always back to the top of the loop. So, not only does it not make any difference, there isn't even any code generated to test anything.


Functionally there is no difference. Any efficiency gained or lost by a difference in bytecode will likely be insignificant compared to any instruction you would run in the body of the loop.


Only the difference is required time for the parser, the two distinct expressions include different number of tokens to be parsed however the computation time difference is very low and the compiled bytecode is the same for two cases.

참고URL : https://stackoverflow.com/questions/8880870/java-for-vs-whiletrue

반응형