본문 바로가기
프로그래밍/boost

BYTE (unsigned char) Stream 에 boost::pool 적용

by neive 2011. 11. 4.
728x90



이미 공개했던 BYTE Stream 이 워낙에 new delete 를 자주 호출 하는 관계로 메모리 단편화의 문제가 생길 수 있을 것 같아

(속도 차는 측정해본 결과 몇 개의 변수 추가로는 0.0015 ~ 6 정도로 차이는 없었음) 이 참에 겸사겸사 boost::pool 을 적용

보았습니다. 전 버전과 틀려진 점은 pool 에서 자동 소멸 기능이 지원되기 때문에 최종적 BYTE* 를 받을 때 스마트 포인터로

안받고 직접적으로 호출을 했다는 점 입니다. 가독성은 떨어지게 됐는데 전 버전과 비교해보면 알 수 있을 겁니다

참고 사이트 : http://www.boost.org/doc/libs/1_47_0/libs/pool/doc/interfaces.html

참고 예제 소스 - 클레스
#define _BUFF_SIZE 128

enum ePacketIndex 
{ 
	eNone = 0,
	eSample,
}; 

class CByteStream   
{ 
	// http://www.boost.org/doc/libs/1_47_0/libs/pool/doc/interfaces.html 
	boost::pool<> m_pool; 
	BYTE*   m_pData; 
	int     m_nSize; 

public: 

	BYTE* GetData() { return m_pData; } 
	int size() { return m_nSize; } 

	template<class T> void AddValue(T t) 
	{ 
		int nLoc = m_nSize; 

		int newSize = 0; 
		if(m_pData == NULL) 
		{   
			newSize = sizeof(T); 
			m_pData = (BYTE*)m_pool.ordered_malloc(newSize); 
			std::cout << "Send Data "; 
		} 
		else
		{ 
			newSize = m_nSize + sizeof(T); 
			BYTE* pTemp = (BYTE*)m_pool.ordered_malloc(newSize); 
			std::copy(m_pData, m_pData+nLoc, pTemp);   // or std::copy(); 
			m_pool.ordered_free(m_pData); 
			m_pData = (BYTE*)m_pool.ordered_malloc(newSize); 
			std::copy(pTemp, pTemp+newSize, m_pData);  // or std::copy(); 
			m_pool.ordered_free(pTemp); 
		} 

		*(T*)(m_pData + nLoc) = (t);   
		std::cout << t << ", "; 

		m_nSize = newSize; 
	}   

	void AddString(std::string s)   
	{   

	} 

	CByteStream(int nMsgIndex) : m_pool(sizeof(_BUFF_SIZE)) 
	{   
		m_pData = NULL; 
		m_nSize = 0; 
		AddValue(nMsgIndex); 
	}   
};

참고 예제 소스 - 사용

void foo()
{
	CByteStream Msg((int)eSample);
	Msg.AddValue(3.14f);
	Msg.AddValue(true);
	Msg.AddString("나는 꼼수다"); 
	Msg.AddString("Test : check");
	std::cout << std::endl;

	boost::asio::mutable_buffer buf = boost::asio::buffer(Msg.GetData(), _BUFF_SIZE);
	boost::system::error_code error; 
	int len = boost::asio::write(m_Socket, boost::asio::buffer(buf, Msg.size()), error);
	
	// ...
}
728x90

댓글