while(1) 과 for(;;)에 차이가 있을까요?

Dr_stein의 이미지

회사 소스를 보면 while(1)을 for(;;)로 고친 코드가 있던데...
상식적으로 납득이 가지를 않네요.. 그런경우그 경험하신분 계신가요?

brandon의 이미지

; + ) 이게 이모티콘으로 바뀌었군요.. 헐헐

hi ~

호랑이의 이미지

while(1) 보다 for( ; ; ; ) 이게 더 빠릅니다.
최적화 할 때 이렇게 하지요.
자세히 기억은 안나지만 while(1)은 맞는지 틀리는지 검사를 하고
for( ; ; ; )는 하지 않는것 같군요.

죠커의 이미지

spert wrote:
while(1) 보다 for( ; ; ; ) 이게 더 빠릅니다.
최적화 할 때 이렇게 하지요.
자세히 기억은 안나지만 while(1)은 맞는지 틀리는지 검사를 하고
for( ; ; ; )는 하지 않는것 같군요.

for( ;; )와 while(1) 정도라면 임플리멘테이션에 따라서 다른 결과가 나올겁니다.

최적화를 잘하는 환경에서는 모두 같은 결과가 나올텐데요.

세벌의 이미지

spert wrote:
while(1) 보다 for( ; ; ; ) 이게 더 빠릅니다.
최적화 할 때 이렇게 하지요.
자세히 기억은 안나지만 while(1)은 맞는지 틀리는지 검사를 하고
for( ; ; ; )는 하지 않는것 같군요.

for 안에 세미콜론이 세 개 들어간 건 처음 보는군요. 특별한 의미라도?

kihlle의 이미지

컴파일러 설계의 기초... 라고나할까요.

혹자들이 생각하시는것처럼, 런타임중에 while(1)이 for( ; ; )에 비해 참거짓검사를 하고 그러진 않습니다. 왜냐하면 항상 참이 되는 비교문은 컴파일러의 첫번째 패스에서 걸러지거든요. 최적화여부와 상관없이 이런것도 걸러내지 못하는 컴파일러는 없습니다.

예를 들면 '(char)var의 값이 500보다 작은경우'와 같은 것입니다.
따라서, 생성되는 기계어는 두 레지스터간의 test 없이 바로 동일한 무조건 분기로 넘어갑니다.

while(1)과 for( ; ; )는 모두 같은 것이며 실제로 생성되는 기계어도 모두 동일하고 어느한쪽이 더 빠르거나 느리지도 않습니다. 리눅스뿐 아니라 모든 플랫폼이 그럴것입니다. :)

homeless

new5244의 이미지

두 가지 경우를 gcc -S 옵션으로 assembly 코드로 확인해 보니 똑같은 결
과가 나오네요...

while (1)

Quote:

void main(void)
{
while(1) {
printf("hello");
}
}

==>

Quote:

main:
pushl %ebp
movl %esp, %ebp
subl $8, %esp
andl $-16, %esp
movl $0, %eax
subl %eax, %esp
.L2:
subl $12, %esp
pushl $.LC0
call printf
addl $16, %esp
jmp .L2

for (; ; )

Quote:
void main(void)
{
for(; ; ) {
printf("hello");
}

}

====>

Quote:
main:
pushl %ebp
movl %esp, %ebp
subl $8, %esp
andl $-16, %esp
movl $0, %eax
subl %eax, %esp
.L2:
subl $12, %esp
pushl $.LC0
call printf
addl $16, %esp
jmp .L2

from saibi

winner의 이미지

볼 때마다 이상한 기분이 들곤 합니다.

STL 은 속도지상주의로 만들어 졌다고 하는데 허접한 compiler 를 위한 배려(-_-)일가요?

nachnine의 이미지

컴파일러의 구현에 따라 다를수도 있겠지만

Asm 코드를 떠보면 일반적으로 같게 나옵니다.

저런 '잘못된 코드 최적화' 이야기가 굉장히 많죠..

sharefeel의 이미지

FreeBSD 커널 코딩 스타일 문서에 보면은
while (1) 이 아니라 for (;; )를 사용하라고 되어 있습니다..

찾아보면 while (1)을 쓰는 스타일도 있겠지요..

제가 볼때는 단지 어떤 스타일을 따르는가의 문제라고 생각합니다.

===============
Vas Rel Por

김희상의 이미지

요즘같은 컴파일러 기술에선 while (1)과 for(;;) 문이 서로 다른 결과로 컴파일된다고는 생각하기 힘들것 같습니다. 당연히 같은 결과물이 나오는게 맞을 것 같고요...

while(1)문을 쓰느냐, for를 쓰느냐는 거의 취향때문이겠지만 컴파일러 warning을 피하고자 하는 의도도 있습니다.
컴파일러나 warning level에 따라서 while (1) 을 쓰면 비교연산이 상수값이라고 warning을 내보내는 컴파일러도 있습니다. for문을 쓰면 최소한 그런 warning은 없앨 수 있지요...
개인적으로는 무한루프라는게 눈에 명시적으로 보이는 while(1)을 더 선호하긴 합니다만.......

경우에 따라선

#define FOREVER_LOOP    for(;;)  
/*#define FOREVER_LOOP    while (1)*/
          :
FOREVER_LOOP
{
          :
}

와 같이 쓰기도 하지요.........

생각나는 김에....조금 다른 얘기이지만,

void func(int used_param, int unused_param)
{
         :
         :
    unused_param;     -------- (1)
}

위의 경우도 'unused_param' 변수가 안쓰는 함수 인자라는 warning을 피하기 위해 (1) 같은 dummy 문을 넣는건 많이들 보셨죠?
arthor77의 이미지

렉스나, 야크로 만든 LALR파서들이 다 그런 문법을 쓰나보는군요.
";;;" 와 (1)의 차이라....

흥미롭네요...
생각을 해보면....

;;;이것은 Non_value이기에 값으로 나오지않을것이고
()는 무조건 value가 나오지않나요? 0, 1 이라는 값으로 나올듯하네요...

다양한 문법이 GCC계열은 어떤지 몰라도 제가 배운 허접한 컴파일러 이론은
그렇습니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.