강좌

C++ boost 메모리풀 강좌 #2: pool 클래스를 이용하여 버퍼에 메모리풀 적용하기

하늘흐늘 2021. 11. 12. 12:44
반응형

boost 메모리풀 관련 클래스 중 pool은 메모리풀을 활용하여 C 스타일로 메모리를 할당 및 해제할 때 사용할 수 있는 클래스입니다. 이런 특성을 가진 관계로 C++에서 C스타일로 메모리를 할당 및 해제하는 버퍼에 적용하기 좋습니다. 이 클래스를 버퍼에 활용하면 메모리풀이 적용되어 성능 향상에 좋습니다.  

간단히 아래 예제를 통하여 살펴보겠습니다.

#include <boost/pool/pool.hpp>
#include <iostream>

using namespace std;

int main(int argc, char* argv[])
{
	boost::pool<> pool(sizeof(char) * 32);

	char* test = (char*)pool.malloc();

	strcpy_s(test, sizeof(char) * 32, "test test test test");

	cout << test << endl;
	cout << pool.is_from(test) << endl;

	cout << pool.get_max_size() << endl;
	cout << pool.get_next_size() << endl;
	cout << pool.get_requested_size() << endl;

	pool.free(test);

	return 0;
}

결과는 아래와 같습니다.

test test test test
1
0
64
32

메모리풀을 사용하기 위해서는 메모리 할당 크기와 할당 개수를 이해하여야 합니다. 메모리풀은 지정 할당 크기의 메모리를 내부 할당 개수 만큼 미리 할당하여 놓고 있습니다. 그리고 요청에 따라 미리 할당한 메모리를 할당 및 해제합니다.
예제를 설명하자면 pool의 생성자에 기본 메모리할당 사이즈를 인자로 넣습니다. 이후 pool의 malloc에는 이 사이즈 만큼의 메모리가 할당됩니다. 위의 코드에서 test변수는 pool.malloc에 의하여 size(char) * 32, 즉 32 바이트를 할당 받습니다.
is_from 함수는 해당 메모리가 pool 객체에서 부터 할당된 것인지 체크합니다. 여러 개의 pool을 만들어 놓고 사용할 때 어느 pool에서 왔는지 체크할 때 사용하기 좋습니다. get_max_size()은 최대 할당 개수를 리턴합니다. 0은 최대 개수를 무한정으로 사용하겠다는 것을 의미합니다. get_next_size()는 pool에 미리 할당된 메모리가 없어 새롭게 할당 할 때 할당할 개수를 리턴합니다. poo클래스는 새롭게 할당할 때 마다 특별히 지정하지 않으면 이전 할당 개수의 2배로 할당합니다. get_requested_size()는 메모리 할당 사이즈로 pool 생성시 인자로 넣은 값을 리턴합니다.

여기까지 왔으면 다양한 버퍼 크기가 있을 경우 어떻게 해야하는가라는 의문이 들 수도 있습니다. 
당연히 다양한 버퍼 크기가 있는 관계로 pool도 N개 있어야 합니다. 약간의 디자인 힌트를 주자면 이럴 때 메모리를 256, 512, 1024 등등으로 정규화 시켜야 합니다. 이럴 경우 약간의 메모리 손실이 있을 수 있는지만 대신 다양한 사이즈에서 메모리 풀의 이점을 얻을 수 있습니다.

 

반응형