jobGuid 꽃미남 프로그래머 "Pope Kim"님의 이론이나 수학에 치우치지 않고 실무에 곧바로 쓸 수 있는 실용적인 셰이더 프로그래밍 입문서 #겁나친절 jobGuid "1판의내용"에 "새로바뀐북미게임업계분위기"와 "비자관련정보", "1판을 기반으로 북미취업에 성공하신 분들의 생생한 경험담"을 담았습니다. 3ds Max를 사용해서 게임용 3D 캐릭터를 셋업하는 방법
이를 위해 오랜 실무를 경험해 온 저자의 고급 노하우들이 공개
위 내용은 GameDevForever의 저자분들의 홍보를 위하여 운영진 자체적으로 올린 광고이며 일체의 수익이 없습니다.(밥좀사줘요~)
Posted by 김포프

사실... 오늘이 제 기고일은 아니지만... 그냥 개인 블로그에 예전에 올린 글들을 좀 살펴보다가 그냥 여기에 올려도 나쁘지 않은 짧은 꼼수가 보여서... 올립니다.... (뭐 어차피 오늘 예약 걸린 글도 안보이더군요...)


제가 10년전에 문자열을 초기화 하던 방법은 다음과 같습니다.


char temp[64];

temp[0] = 0;


근데 2006년인가 캡콤 밴쿠버에서 일할 때, 동료 프로그래머 하나가 다음의 방법이 더 낫다고 귀뜸해줬지요.


char temp[64] = {0, };


그 친구가 이 방법이 더 나은 이유를 말해줬던거 같은데 사실 기억은 안나고... -_- 그냥 그 뒤로 줄곧 이 방법을 사용해왔죠. 뭐, 더 나은 방법이라니까.... 믿지 뭐..... 근데 최근(사실 첨 글쓴 시기로는 1년전.... -_-)에 우연히 이 방법이 왜 더 나은지를 알게되었습니다.


Xbox 360에서 프로파일 캡춰를 하던 도중 위의 코드가 컴파일되면 어떻게 변하는지를 찾아냈거든요. 다음과 같아요.


char temp[64];

memset(temp, 0, sizeof(char) * 64);


흥미로운 사실.. memset이 호출된다. 이 방법은 5~10 마이크로세컨드 정도가 걸리는데(물론 엑박360 하드웨어에서) 사실 뭐 그리 걱정할 정도는 아니고요. 근데 생각해보면 char 버퍼 선언뒤에 곧바로 strcpy 등의 함수를 호출한다면 굳이 위와 같은 초기화는 할 필요가 없겠네요. (뭐가되든 null 캐릭터만 들어가면 되니까요.)





TAG

댓글을 달아 주세요

  1. Favicon of http://gamedevforever.com 디퍼드H 2012.05.20 10:34 신고  댓글주소  수정/삭제  댓글쓰기

    오호! 흥미롭네요~ 이젠 이렇게 써야겠군.

  2. Favicon of http://bluekms21.blog.me 크로스 2012.05.20 13:34 신고  댓글주소  수정/삭제  댓글쓰기

    std::string을 알게된 뒤론 char*로 문자열을 안쓰게된지 좀 되었지요 ~_~ㅎ
    그런데 위 코드는 내부적으로 memset을 부른다니 흥미롭네요.

  3. Favicon of http://gamedevforever.com denoil 2012.05.21 10:16 신고  댓글주소  수정/삭제  댓글쓰기

    내가 줄곧 사용하던 방법인데 memset이 맞아여?
    char Temp[3] = { 0, }; 이렇게하면 3개의 배열 요소가 0으로 초기화 되긴하는데
    char Tmep[3] = { 1, }; 해버리면 1, 0, 0 이런식으로 초기화 되거든요.
    memset으로는 1, 0, 0이 나올수 없으니..0이 아닐때는 뭐 물같은걸 끼얹나?
    제가 아는 C언어 지식으로는 { .. } 이 안에 쓴 숫자만 그 숫자로 초기화 된 후에
    나머진 0으로 초기화 하는걸로 알고 있습니다.

  4. Favicon of http://gamedevforever.com denoil 2012.05.21 10:32 신고  댓글주소  수정/삭제  댓글쓰기

    역시나 테스트 해보니 결론은
    char Temp[3] = {}; <- 이렇게 {} 하면 모두 0으로 초기화 되고
    {..} <- 이 안에 들어가는 숫자는 0으로 초기화 후에 해당 숫자로 셋팅 하는가 보네요.
    포프형한테 추가 작성해달라니깐 그냥 댓글달으라네요-_-;;

  5. Favicon of http://devsw.tistory.com swkwon04 2012.05.21 11:12 신고  댓글주소  수정/삭제  댓글쓰기

    굳이 순서를 따지자면..

    char temp[10] = {1, 2, }; 를 MSVS2010 32bit 에서 테스트해본 결과..

    temp[0] = 1;
    temp[1] = 2;
    가 먼저 이루어 지고, temp[2] ~ temp[9] 까지는 4Byte씩 0으로 초기화 합니다.

    char temp[10] = {0, }; 이 컴파일 후 memset을 호출 하는 이유는 컴파일러가 컴파일 하면서
    코드를 바꾸는 것 아닌가 싶어요.

    • Favicon of http://gamedevforever.com 김포프 2013.05.08 15:16 신고  댓글주소  수정/삭제

      저도 시간나서 좀더 테스트 해보고 표준도 살펴봤는데.. 네 최적화 과정해서 memset으로 바꿔주는거 같더라구요...

      표준 어디를 보니 속에 아무내용없이 {,} 이런식으로 선언해주면 default 생성자의 값으로 넣어준다더군요... 단 그것도 무슨 예외가 있음... (대충 읽어서 잘 기억이.. -_-)

      뭐든간에 전 char 배열에서만 쓸 생각입니다...

  6. Favicon of http://병맛블로그 책읽는잉여 2012.05.21 14:32 신고  댓글주소  수정/삭제  댓글쓰기

    제가 알고 있기론..
    기본생성자를 호출해주는 것으로 알고요..
    builtin type 의 경우에는 제로초기화가 적용되는 것으로 알아요..

    int AAA[3] = {4,};
    이건 AAA[3] = {4, int(), int() };
    이렇게..

  7. Favicon of http://www.sysnet.pe.kr kevin 2012.05.23 23:43 신고  댓글주소  수정/삭제  댓글쓰기

    ^^ 항상 재미있는 글들 잘 읽고 있습니다. 저도 이에 대해서 의견을 쓰다가 너무 길어져서 ^^ 별도의 글로 한번 정리해보았습니다.

    Visual C++ 배열 초기화를 위한 기계어 코드 확인
    ; http://www.sysnet.pe.kr/2/0/1291

  8. 테드 2012.06.13 16:41 신고  댓글주소  수정/삭제  댓글쓰기

    컴파일러에 따라, 전역이냐 로컬이냐에 따라 다릅니다.
    int a[] = { 0, };을 코딩 하였을때
    전역이라면 자동으로 데이터 영역에 0으로 채워진 메모리 블럭을 생성하구요.
    예전에 제가 직접 네이티브로 디버깅한 어떤 컴파일러는
    로컬에 스택 프레임을 생성하고 memset를 호출하지 않고 최적화된 코드로 초기화를 하더군요.
    XBOX는 어떻게 생성하는지 코딩을 해보지 않아서 잘 모르겠습니다.
    스택프레임에 메모리 배열을 사용하는 것은 초기화를 해야 하기 때문에 속도에서 불리할 뿐만 아니라...
    초기화하지 않을 경우에는 쓰레기 값 때문에 위험하구요.
    자칫 버퍼 오버플로우를 체크하지 않는 라이브러리들을 호출하였다가 해킹에 노출되는 도안 이슈를 발생시키도 합니다.
    c언어의 경우라면 스택 프레임에는 개체 레퍼런스나 포인터, 밸류 타입 변수만 있는 것이 보안이나 속도 면에서 좋습니다.

    • Favicon of http://gamedevforever.com 김포프 2012.12.30 05:43 신고  댓글주소  수정/삭제

      보안적인 측면에선 동의하지만.. 속도적인 측면에서는 글쎄요..? 이걸 Heap에서 메모리 할당을 하는게 속도가 더 걸릴거 같은데요?



티스토리 툴바