You are here: Home - Studies∞ - GDC Day-5 Class 2

1204012006

Faster C++: Move construction and perfect fowarding
Room 2003, West hall
Speaker : Pete Isensee in Microsoft

예전에 엔진 아키텍트로 있을 때에는 최신의 프로그래밍 기법, 렌더링 스킬 같은 것에 매우 관심이 많았고, 또 다양한 정보를 입수하고 학습하기 위해 많은 시간과 노력을 기울였었습니다. 하지만 프로듀서로 자리를 옮기면서 어떻게 하면 종합 예술인 게임을 제대로 완성하고 그 안에서 유저들이 재미를 찾을 수 있게 될 것인지, 어떻게 하면 많은 개발자들이 방향을 잡고 앞으로 나가갈 수 있을 지에 대한 것으로 관심이 옮겨가게 되었습니다. 이번 GDC에서도 프로그래밍 스킬 강연은 거의 참석하지 못한 연유도 이 때문입니다. 물론 GDC의 주제가 모바일 비즈니스 쪽으로 이동한 이유도 있지만 말입니다. 오랜만에 본 강연은 순수하게 프로그래밍 테크닉에 관련된 내용입니다. 몇 가지 C++ 11의 새로운 문법과 기능을 설명하는 것으로 구성되어 있는데, 내용을 한번 훑어보시고 관심있는 분들은 키워드 검색을 통해 보다 자세한 사용법을 익혀보시기 바랍니다.

강연자는 마이크로소프트의 Advanced Technlogy Group에서 일하고 있었습니다. 하지만 이번 강연의 내용은 C++의 새로운 표준 규격인 11에 탑재되어 있는 다양한 새로운 키워드 중 두 가지를 다루는 것으로 비주얼스튜디오나 윈도우 같은 개발 환경에 크게 의존적인 내용은 아닙니다.

Gud morning C++ People~! / 개인적으로 정말 반가운 인사였습니다. 몇 백명 씩 모여있는 전세계의 C++ 집단이라니 큰 신도 집회에 온 것 같은 느낌이랄까요. 옆의 누구와도 코드로 의사소통 할 수 있는 느낌이었습니다.

게임에서 객체의 복제는 엄청나게 많이 일어납니다. 특히 파티클 같은 시스템이라면 매우 많지요. 그런데 deep object copy는 매우 cost가 큽니다. deep object란 데이터의 포인터만 멤버변수로 들고 있는 것을 말합니다. 즉, 내부의 데이터를 복제하려면 memcpy를 각 포인터별로 따로 해줘야 하는 것이죠.
deeper object도 있습니다. 이것은 데이터가 STL vector 같은 것으로 구현된 것을 말합니다. 아니면 3D렌더링용으로 텍스쳐의 아이디를 가지고 있는 것도 비슷합니다. 그냥 1단계의 memcpy만으로도 대상 데이터가 복제 되지 않죠.

아까 이야기한 파티클로 돌아가봅시다. 파티클 시스템안에 STL vector로 파티클 오브젝트들이 셋업되어 있다고 하면, 이런 파티클 시스템을 new로 allocation할 때 STL안의 객체까지 전부 복사해서 넣어야 하는데 엄청난 cost가 듭니다. 이때 우리가 알게 모르게 많이 사용하는 temporary object를 사용하는 아이디어가 있습니다. 이것이 오늘 설명할 것 중 하나인 rvalue reference의 컨셉입니다.

rvalue reference는 C++11의 특징 중 한가지입니다. 먼저 rvalue가 무엇인지 조금 설명하자면 오른쪽에 들어가는 값이라는 뜻인데, 이는 movable object입니다.

어드레스가 없고, 메모리에 없으며, 이름도 없지만 대신 옮길 수는 있습니다. 몇 가지 예를 들어보죠.

++x ; lvalue
x++; rvalue
x() ; rvalue
X x(); lvalue

어떤게 rvalue인지 이해 되시리라 믿습니다. 보통 t& 이걸 lvalue reference라고 합니다. 반면 t&& 이것이 rvalue reference입니다. 참조연산자 2개를 겹쳐서 표현합니다.

rvalue reference를 잘 사용한다면 복사 명령을 깔끔하게 정리할 수 있습니다. STL안에서는 move라는 개념을 잘 이해해야 합니다. rvalue 레퍼런스는 맴버 변수인 포인터 자체만 복사한다고 이애하면 편할 것입니다. 또 이를 잘 이용하면 생성과 초기화에서 쓸데 없이 각각 2번 데이터들이 복사되는 것 또한 방지할 수 있습니다.

두 번째의 오늘 강연 키워드는 Perfect forwarding 입니다. 이는 템플릿 rvalue reference로 어떤 변수와도 바인딩 될 수 있는 문법입니다. 이것으로 Perfect constructor를 만들 수 있는데, 모든 파라미터를 바인딩 할 수 있기 때문에 예전에 템플릿처럼 모든 생성자를 만들 필요가 없이 단 하나의 생성자만으로 어떤 파라미터도 받아 생성할 수 있게 됩니다.

C++ 11의 모든 STL 컨테이너, 알고리즘에 이미 이 내용이 적용되어 있습니다. 여러분들의 코드에 본 키워드들을 사용하지 않더라도, 그냥 최신 버전으로 컴파일만 다시한번 하는 것으로 바로 성능 향상이 있을 겁니다.

본 내용은 GCC 4.3.3 과 비주얼스튜디오10에서 지원됩니다. 그 밖의 다른 지원 내용은 표를 참고해 주십시오.

오늘 다룬 이 내용은 매우 최신의 것으롤 아직 관련 서적 등이 나와있지 않습니다. 내용의 디테일이 궁금하시거나, 본 기술을 적용시킬 생각이 있으신 분들은 Microsoft 웹사이트를 통해서 관련 정보들을 입수하실 수 있습니다. 특히 Scott Mayers의 블로그를 추천합니다.

간단히 소개만 하는 강연이었기 때문에 C++11의 모든 특징을 다루지는 않았지만 강연자는 내년에 다른 내용들을 추가로 다루고 싶다는 이야기를 하며 본 강연을 마쳤습니다. 실제로 기술을 사용하기 위해서는 설명된 다른 자료들을 천천히 읽으며 학습해야 할 것으로 생각되며, 본 강연의 정리는 개괄적으로 본 기술을 적용할 만한 여지가 있는지 판단하시는데 도움이 되었으면 하는 바램으로 작성되었습니다.

C++ People forever!

by Kay Park

Leave a Reply

Back to top