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
1745 [커널 15차 D팀] 23주차 스터디 장소 [4] 라이더 2018.10.01 7
1744 [커널 15차 A팀] 30주차(2018-11-17) 스터디 장소공지 오곡라떼 2018.11.16 10
1743 [커널 15차 D팀] 24주차 스터디 장소 [4] 라이더 2018.10.08 10
1742 [커널 15차 A팀] 30주차(2018-11-17) 스터디 참석인원 조사 [5] 오곡라떼 2018.11.12 12
1741 [커널 15차 D팀] 27주차 스터디 장소 공지 [3] 형준 2018.10.31 13
1740 [커널 15차 D팀] 25주차 스터디 장소 [7] 라이더 2018.10.14 13
1739 [커널 15차 D팀] 28주차 참석인원 조사 [1] 김정근 2018.11.09 18
1738 [커널 15차 D팀] 26주차 스터디 장소 공지 [2] 형준 2018.10.22 18
1737 [커널 15차 D팀] 30주차 장소공지 [2] 형준 2018.11.21 21
1736 [커널 15차 D팀] 29주차 참석인원 조사 [4] 김정근 2018.11.13 24
1735 [커널 15차 A팀] 25주차 2018년 10월 13일 (토) 스터디 노트 오곡라떼 2018.10.14 30
1734 [커널 15차 D팀] 31주차 참석인원 조사 김정근 2018.12.05 38
1733 안녕하세요 질문있습니다 ! [1] r3ckless 2018.11.18 44
1732 [커널 16차 C팀] 4주차 스터디 노트 Yags 2019.06.19 46
1731 [커널 14차C] 6주차(20170617) 스터디 장소 공지 CLOCK 2017.06.16 50
1730 [커널 16차 C팀] 3주차 스터디 노트 Yags 2019.06.11 54
1729 [커널 14차C] 4주차(20170603) 스터디 장소 공지 CLOCK 2017.06.01 55
1728 [커널 16차 C팀] 5주차 스터디 노트 Yags 2019.06.26 55
1727 [커널D팀] 3주차 장소 공지 밤색모자이크 2018.05.11 56
1726 [커널 15차 A팀] 13주차(2018-07-21) 스터디 노트 바뿌사 2018.07.22 56
XE Login