lilo.c에서 !! 관한 토론?

오시리스 2011.07.25 23:01 조회 수 : 34354

lilo.c 를 보면서, 잠깐 이야기 되었던 것중 하나입니다. 별로 중요하지 않은 내용인데, 괜히 올리는 것 같기도 하고 그렇지만, 노섭님께 올려보겠다라는 말을 했던터라, 그냥 올려 봅니다 ^^;;


int func() {

  int t = 100;

  return !!t; <---(1)

  //return t; <---(2)

}


void main() {

  int ret = func()

  if(ret) <---(3)

    printf("func()n");

}


코드에서 굳이 !!를 써줄 이유가 있을까가 원인이었는데, 성노섭님께서 "if대신 bit연산이 2사이클 정도 빠릅니다"라는 말이 이해가 가지 않아, 서로 이야기 해본 결과, 다른 부분에 초점을 맞추고 이야기를 했다는것을 알았습니다. 저같은 경우엔 "그렇다면 c코드 상에서 2번인 경우가 더 빠르지 않는가?" 라는 것이였고, 노섭님은 "return 할때, if문(?: 연산자)을 사용하지 않고, bit로 직접 0,1로 바꿔주기 때문에 2사이클 정도 빠르다는 이야기였습니다." 저는 3번 쪽의 if문에서는 똑같은데, 굳이 그렇게 쓴 것이 이해가 가지 않아서였는데, 결국엔,1,0으로 바꾸는 것은 lilo config 를 위해서 flag를 써주기 비교해주기 위해서 였습니다.


objdump를 해본 결과 (1)이 들어간 경우가 명령어 코드가 2개 더 늘어나 있었는데, 실제론 더 빠르게 되는건지는 잘 모르겠습니다.


 (2) return t;

 (1) return !!t;

...상략...

00000000004004f4 <func>:

  4004f4:       55                      push   rbp

  4004f5:       48 89 e5                mov    rbp,rsp

  4004f8:       c7 45 fc 64 00 00 00    mov    DWORD PTR [rbp-0x4],0x64

  4004ff:       8b 45 fc                mov    eax,DWORD PTR [rbp-0x4]

  400502:       c9                      leave

  400503:       c3                      ret


0000000000400504 <main>:

  400504:       55                      push   rbp

  400505:       48 89 e5                mov    rbp,rsp

  400508:       b8 00 00 00 00          mov    eax,0x0

  40050d:       e8 e2 ff ff ff          call   4004f4 <func>

  400512:       85 c0                   test   eax,eax

  400514:       74 0a                   je     400520 <main+0x1c>

  400516:       bf 1c 06 40 00          mov    edi,0x40061c

  40051b:       e8 d0 fe ff ff          call   4003f0 <puts@plt>

  400520:       b8 00 00 00 00          mov    eax,0x0

  400525:       c9                      leave

  400526:       c3                      ret

<meta http-equiv="content-type" content="text/html; charset=utf-8"> ...하략...

...상략...

00000000004004f4 <func>:

  4004f4:       55                      push   rbp

  4004f5:       48 89 e5                mov    rbp,rsp

  4004f8:       c7 45 fc 64 00 00 00    mov    DWORD PTR [rbp-0x4],0x64

  4004ff:       83 7d fc 00             cmp    DWORD PTR [rbp-0x4],0x0

  400503:       0f 95 c0                setne  al

  400506:       0f b6 c0                movzx  eax,al

  400509:       c9                      leave

  40050a:       c3                      ret


000000000040050b <main>:

  40050b:       55                      push   rbp

  40050c:       48 89 e5                mov    rbp,rsp

  40050f:       b8 00 00 00 00          mov    eax,0x0

  400514:       e8 db ff ff ff          call   4004f4 <func>

  400519:       85 c0                   test   eax,eax

  40051b:       74 0a                   je     400527 <main+0x1c>

  40051d:       bf 1c 06 40 00          mov    edi,0x40061c

  400522:       e8 c9 fe ff ff          call   4003f0 <puts@plt>

  400527:       b8 00 00 00 00          mov    eax,0x0

  40052c:       c9                      leave

  40052d:       c3                      ret

  ...하략...

<meta http-equiv="content-type" content="text/html; charset=utf-8">



그리고, 박민규님이 말씀하신,lilo 컴파일 할때의 옵션인 -s 옵션으로 컴파일해서 해봤더니, 마치 inline함수처럼 심볼이 사라지고, 코드가  직접 들어가더군요.

<style type="text/css">::-webkit-scrollbar-track-piece:vertical {background-color:#eee;-webkit-border-radius: 0px;}::-webkit-scrollbar-track-piece:horizontal {background-color:#eee;-webkit-border-radius: 5px;}::-webkit-scrollbar {width: 9px;height: 9px;}::-webkit-scrollbar-thumb{ background-color:undefined; -webkit-border-radius:6px;}::-webkit-scrollbar-thumb:hover{background-color:undefined;!important -webkit-border-radius:6px;}</style>
번호 제목 글쓴이 날짜 조회 수
공지 [공지] 커널 스터디 관련 Q&A 게시판 입니다. [5] woos 2016.04.09 2198
925 사용할 저장소 입니다. [13] 박민규 2011.09.06 3417
924 [x86] boot process [1] pororo 2011.09.05 3261
923 [x86_초] 9/10은 쉽니다. file pororo 2011.09.04 2282
922 lilo가 끝났습니다. [7] pororo 2011.08.20 2606
921 이제까지 나온 as86 문법 몇가지 정리 pororo 2011.08.18 2539
920 이번주에는 텝스시험이 있어서 못 갈 것 같습니다. [2] 심우진 2011.08.17 2630
919 이번주에는 텝스시험이 있어서 못 갈 것 같습니다. 심우진 2011.08.17 2275
918 map 파일 덤프입니다. [1] file pororo 2011.08.16 3066
917 virtualbox, lilo [5] 박민규 2011.08.14 3142
916 [x86] 궁금한것 몇가지 찾아봤습니다. pororo 2011.08.08 2928
915 LILO가 커밋되고 있는 레파짓토리 입니다. [4] 박민규 2011.08.06 3162
914 좋은 스터디 그룹모임이네요~ [1] 이상일 2011.08.04 2727
913 안녕하세요.. 휴우 [6] 류대우 2011.08.03 2861
912 저번주에 나온것 [1] pororo 2011.08.02 2276
911 내년 커널스터디 지원에 앞서 질문드립니다. [4] 이승우 2011.08.02 2967
910 강의실 변경. 심우진 2011.07.30 2231
909 지난주 스터디중에 잠깐 이야기 나왔던 컴파일과정.. 성노섭 2011.07.28 2620
908 device mapper관련 문서 [1] file 오시리스 2011.07.25 6697
» lilo.c에서 !! 관한 토론? [6] 오시리스 2011.07.25 34354
906 lilo second 오늘 본 부분 pororo 2011.07.23 2315
XE Login