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 2193
1745 setup.c 파일의 cacheid_init 함수 [1] file HyunGyu 2013.11.05 72258
1744 Vol.1의 CMPS ~ CVTPD2PS 입니다. 늦어서 죄송합니다. file 지현구 2007.03.10 64198
1743 as86(1) - Linux man page 입니다. 김민석 2010.04.30 36679
» lilo.c에서 !! 관한 토론? [6] 오시리스 2011.07.25 34354
1741 [ARM중] 1차 분석 복습 [5] file 홍문화 2011.08.08 33704
1740 ZONE_DMA, ZONE_NORMAL, ZONE_HIGHMEM (미완성) 구본규 2013.10.15 32764
1739 fork() 함수가 리턴을 두번하는 이유 설명 [2] 커널B조 2016.05.07 30222
1738 task_struct 구조체입니다. [1] file 아폴로 2013.04.30 29852
1737 ARM 프로세서 모드 [7] 홍문화 2011.06.08 26499
1736 BIOS 를 통하여 PCI configuration space를 액세스하는 방법 지현구 2007.08.12 22862
1735 파이프라인과 익셉션의 관계 관련 블로그 주소입니다. 이한울 2012.05.26 22081
1734 buildroot 사용법 [1] 구본규 2012.07.20 20240
1733 [x86] 스터디때 나왔던 cpu_dev 문제 [2] file pororo 2012.02.19 18428
1732 페이지 테이블에 주소 변환 정보가 채워지는 원리 [16] 홍문화 2011.07.12 16325
1731 odroid bootlog 입니다 박장운 2010.08.14 15560
1730 명령어 정리 - 늦어서 죄송.. 송형주 2007.03.09 14524
1729 Linux booting 과정 (start_kernel() 함수 전까지) 관련 참고자료들 모음 file 지현구 2007.04.27 14328
1728 분석 환경 구축 실습 [11] file 권석민 2013.05.19 14203
1727 [x86] 가족번호 [2] pororo 2012.02.27 13911
1726 LVM에 대해 간략하게 정리했습니다. [2] file 조성진 2013.05.07 13824
XE Login