요즘같은 컴파일러 기술에선 while (1)과 for(;;) 문이 서로 다른 결과로 컴파일된다고는 생각하기 힘들것 같습니다. 당연히 같은 결과물이 나오는게 맞을 것 같고요...
while(1)문을 쓰느냐, for를 쓰느냐는 거의 취향때문이겠지만 컴파일러 warning을 피하고자 하는 의도도 있습니다.
컴파일러나 warning level에 따라서 while (1) 을 쓰면 비교연산이 상수값이라고 warning을 내보내는 컴파일러도 있습니다. for문을 쓰면 최소한 그런 warning은 없앨 수 있지요...
개인적으로는 무한루프라는게 눈에 명시적으로 보이는 while(1)을 더 선호하긴 합니다만.......
; + ) 이게 이모티콘으로 바뀌었군요.. 헐헐
; + ) 이게 이모티콘으로 바뀌었군요.. 헐헐
hi ~
차이가 있지요.
while(1) 보다 for( ; ; ; ) 이게 더 빠릅니다.
최적화 할 때 이렇게 하지요.
자세히 기억은 안나지만 while(1)은 맞는지 틀리는지 검사를 하고
for( ; ; ; )는 하지 않는것 같군요.
믿음이 아닐까요?
for( ;; )와 while(1) 정도라면 임플리멘테이션에 따라서 다른 결과가 나올겁니다.
최적화를 잘하는 환경에서는 모두 같은 결과가 나올텐데요.
- 죠커's blog / HanIRC:#CN
Re: 차이가 있지요.
for 안에 세미콜론이 세 개 들어간 건 처음 보는군요. 특별한 의미라도?
세벌 https://sebuls.blogspot.kr/
둘다 같습니다.
컴파일러 설계의 기초... 라고나할까요.
혹자들이 생각하시는것처럼, 런타임중에 while(1)이 for( ; ; )에 비해 참거짓검사를 하고 그러진 않습니다. 왜냐하면 항상 참이 되는 비교문은 컴파일러의 첫번째 패스에서 걸러지거든요. 최적화여부와 상관없이 이런것도 걸러내지 못하는 컴파일러는 없습니다.
예를 들면 '(char)var의 값이 500보다 작은경우'와 같은 것입니다.
따라서, 생성되는 기계어는 두 레지스터간의 test 없이 바로 동일한 무조건 분기로 넘어갑니다.
while(1)과 for( ; ; )는 모두 같은 것이며 실제로 생성되는 기계어도 모두 동일하고 어느한쪽이 더 빠르거나 느리지도 않습니다. 리눅스뿐 아니라 모든 플랫폼이 그럴것입니다. :)
homeless
두 가지 경우를 gcc -S 옵션으로 assembly 코드로 확인해 보니
두 가지 경우를 gcc -S 옵션으로 assembly 코드로 확인해 보니 똑같은 결
과가 나오네요...
while (1)
==>
for (; ; )
====>
from saibi
SGI STL 에서 많이 봅니다.
볼 때마다 이상한 기분이 들곤 합니다.
STL 은 속도지상주의로 만들어 졌다고 하는데 허접한 compiler 를 위한 배려(-_-)일가요?
컴파일러의 구현에 따라 다를수도 있겠지만Asm 코드를 떠보면 일
컴파일러의 구현에 따라 다를수도 있겠지만
Asm 코드를 떠보면 일반적으로 같게 나옵니다.
저런 '잘못된 코드 최적화' 이야기가 굉장히 많죠..
coding convention 에 더 많이 영향을 받을 것 같습니다.
FreeBSD 커널 코딩 스타일 문서에 보면은
while (1) 이 아니라 for (;; )를 사용하라고 되어 있습니다..
찾아보면 while (1)을 쓰는 스타일도 있겠지요..
제가 볼때는 단지 어떤 스타일을 따르는가의 문제라고 생각합니다.
===============
Vas Rel Por
요즘같은 컴파일러 기술에선 while (1)과 for(;;) 문이 서로
요즘같은 컴파일러 기술에선 while (1)과 for(;;) 문이 서로 다른 결과로 컴파일된다고는 생각하기 힘들것 같습니다. 당연히 같은 결과물이 나오는게 맞을 것 같고요...
while(1)문을 쓰느냐, for를 쓰느냐는 거의 취향때문이겠지만 컴파일러 warning을 피하고자 하는 의도도 있습니다.
컴파일러나 warning level에 따라서 while (1) 을 쓰면 비교연산이 상수값이라고 warning을 내보내는 컴파일러도 있습니다. for문을 쓰면 최소한 그런 warning은 없앨 수 있지요...
개인적으로는 무한루프라는게 눈에 명시적으로 보이는 while(1)을 더 선호하긴 합니다만.......
경우에 따라선
와 같이 쓰기도 하지요.........
생각나는 김에....조금 다른 얘기이지만,
위의 경우도 'unused_param' 변수가 안쓰는 함수 인자라는 warning을 피하기 위해 (1) 같은 dummy 문을 넣는건 많이들 보셨죠?
컴파일러의 기본적인 파싱능력의 차이라고 보지 않을까요?
렉스나, 야크로 만든 LALR파서들이 다 그런 문법을 쓰나보는군요.
";;;" 와 (1)의 차이라....
흥미롭네요...
생각을 해보면....
;;;이것은 Non_value이기에 값으로 나오지않을것이고
()는 무조건 value가 나오지않나요? 0, 1 이라는 값으로 나올듯하네요...
다양한 문법이 GCC계열은 어떤지 몰라도 제가 배운 허접한 컴파일러 이론은
그렇습니다.
댓글 달기