블로그 이미지
fiadot_old

칼퇴근을 위한 게임 서버 개발 방법론에 대한 심도있는 고찰 및 성찰을 위한 블로그!

Rss feed Tistory
Technical Article 2007. 7. 14. 15:29

VS2005에 추가된 키워드 for each

STL을 사용하다 전체 노드에 대해 모두 어떠한 함수를 적용해야 할때

for_each란 generic algorithm을 사용하게 된다.

그런데 이 부분이 좀 문제가 있는게 함수를 쓰던지 클래스를 새로 생성해서

operator()를 구현해줘야 한다.

심플하게 끝내자고 해놓은 것이 복잡도만 높이고 있는 형국이다.

이를 타계하기 위해서는 2가지 방법이 있다.

첫번째는 for_each에 대해 적용될 함수셋을 구현해놓는방법.

http://levites.pe.kr/tt/index.php?pl=20 

여기에 잘나와있던데 좀 불편하다.

두번째는 Visual Studio 2005에 추가된 키워드인 for each를 사용하는 방법이다.


class CBroadCast
{
public:
 CBroadCast(CPacket &refSendPkt) : m_refSendPkt(refSendPkt), m_nSendCnt(0)
 {
 
 }

 void operator()(CFiaSession* pNode)
 {
  pNode->SendPacket(m_refSendPkt);
  m_nSendCnt++;
 }


 CPacket &m_refSendPkt;
 int  m_nSendCnt;
};


 

int  CRoom::BroadCasting( CFiaSession *pSession, CPacket &refSendPkt)
{
..
CBroadCast bc(refSendPkt);
bc += for_each(m_vecUser.begin(), m_vecUser.end(), bc);
..
}


이런 형태로 STL for_each를 사용 했다면,

 int nCnt = 0;
 for each(CFiaSession* it in m_vecUser)
 {
  it->SendPacket(refSendPkt);
  nCnt +=1;
 }

2005에서는 이렇게 for each를 사용하면 된다.


일반적으로 iterator를 이용해서 순회하면서 for each의 형태로 구성 해서 사용했다.

하지만, OS종속적이며 퍼포먼스를 지향하는 서버 어플리케이션에서

OS호환성은 고려대상의 범위에서 벗어나기에, for each로 구현을 했다.


지은이햄의 테스트 결과로 "for_each보다 for each가 퍼포먼스 면에서도 우수했다"고 한다. ^^

코드면에서도 깔끔하고 성능도 나으니 안쓸이유가 없네..

,
TOTAL TODAY