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
'프로그래밍 > boost' 카테고리의 다른 글
| boost::thread / boost::thread_group (0) | 2011.11.08 |
|---|---|
| ByteStream / CallbackMrg (0) | 2011.11.05 |
| boost::function 으로 callback map 만들기 (0) | 2011.11.03 |
| boost::asio::buffer (0) | 2011.10.28 |
| boost::asio 비동기 TCP + echo 서버 / 클라이언트 (6) | 2011.10.27 |
댓글