안녕하세요. ozlael형님 보다 1년이나 젋은 랩좀비, 랩하는 좀비군입니다. 영계입니다(...)
오늘은 회사에서 일을 하다가 매우 눈에 거슬리는 함수를 발견해서, 그것을 좀 더 스무스하게 바꾼 경험에 대해서 얘기해 볼까합니다. 뭐 다들 알고 있는 것일 수도 있구요.
일단 다음과 같은 함수가 있었습니다.
CBaseObject* CWorld::GetIndexedObject(int index) { int curIndex = 0; for ( auto iter = m_objectList.begin() ; iter != m_objectList.end() ; ++iter ) { if ( curIndex == index ) return iter->second; ++curIndex; } return nullptr; }
이 함수의 문제점은 외부에서 컨테이너에 접근하기 위해서 0~m_objectList.size()까지 하나씩 접근하게 된다는 거지요. 그래서 오브젝트의 갯수가 10개 정도만 되도 55번의 계산을 반복하게 됩니다. 100개가 되면 5050개로 기하급수적으로 많아지게 되는 아름답지 못한 상황이 펼쳐집니다.
아마 저렇게 구현이 된 이유가 vector가 아닌 list나 map이어서 그랬을 겁니다. vector라면 문제가 없죠. -캐쉬문제는 일단 넘어가고- 그냥 return 하면 되니까요. 그래서 어떤 방식으로 처리할까 고민하다가, 람다와 std::function을 통해서 나름 아름답게 처리가 되도록 변경하였습니다.
함수 본체는 이렇게 구현되고.. ...(std::function이 html을 방해해서 그냥 붙여 넣기)
{
std::for_each(m_objectList.begin(), m_objectList.end(), [&](std::pair<OBJHANDLE, CBaseObject*> objHandle) {
Func(objHandle.second);
});
}
void CView::OnUpdateDynamicObjectTitle( float elapsedTime ) { auto UpdateTitleGagueFunct = [=](CBaseObject* pBaseObject) //람다로 미니함수를 만듭니다. { pBaseObject->UpdateTitleGauge(elapsedTime); }; m_pWorld->ApplyFunctionToBaseObject(UpdateTitleGagueFunct); //람다를 넘겨주어서 컨테이너 안에서 계산하도록 합니다. }
'프로그래밍' 카테고리의 다른 글
유니티엔진의 coroutine & yield 1편. FSM의 습격 (5) | 2012.06.20 |
---|---|
데이터타입을 가지고 있는 메시지ID (6) | 2012.06.18 |
std::function이 좋네. (12) | 2012.06.17 |
유니티는 C#으로 작성했다? (9) | 2012.06.17 |
Unity, 널 사랑하지만 너의 UV만은 용납할 수 없다. 철썩~ (21) | 2012.06.10 |
유니티 엔진의 멀티플랫폼 심장 Mono (15) | 2012.06.05 |
댓글을 달아 주세요
for ( auto iter = m_objectList.begin() ; iter != m_objectList.end() ; ++iter )
iter->second->UpdateTitleGauge(elapsedTime);
이거랑 같은건가요?
넵. 같습니다.
2010 아니어도 boost::function, boost::bind 를 쓸 수 있다는!
그렇다는!
하지만 2010이 아니면 람다.. ㅠㅠ
람다는 C++의 한줄기 빛입니다.
부스트도 람다 있다는!
boost::lambda
전 그 발음하기 어려운 C++아저씨 책 나올 때까지 참는 중ㅜㅜ
네이티브 멀티플랫폼 개발자에게는 먼 산 이야기~ 냥~
함수만 보고 http://www.cplusplus.com/reference/std/iterator/advance/ 쓰란 얘길 줄 알았는데 다른 얘기였군요...
lambda를 인자로 받는 함수는 std::function말고 템플릿으로 구현하는 방법도 있습니다.
속도는 이게 더 빠르다고 알고 있습니다.
http://rein.kr/blog/archives/2279 <- 이 포스팅을 참고 하세요.
움?!
그냥
std::advance 쓰면 훨씬 더 아름다워 질거 같은데요;;;