강좌

C++ boost 메모리풀 강좌 #5: boost 메모리풀 할당자를 적용하여 STL 컬렉션의 성능 향상시키기

하늘흐늘 2021. 11. 15. 13:27
반응형

STL 컬렉션은 템플릿 지정자를 이용하여 메모리 할당자를 설정할 수 있습니다. 참고로 메모리 할당자란 컬렉션에 요소에 대해서 메모리 new / delete하는 객체를 말합니다. STL 컬렉션에 메모리 할당자를 메모리풀을 사용하도록 하여 성능을 향상 시킬 수 있습니다. 
boost에는 이 STL 컬렉션 관련 메모리 풀 지원 할당자가 pool_allocator와 fast_pool_allocator이 있습니다. 두 할당자 모두 어느 STL 컬렉션에나 사용할 수 있습니다.
특징적으로 pool_allocator는 vector처럼 연속된 메모리 할당 및 해제가 일어나는 STL 컬렉션에서 성능이 좋습니다. fast_pool_allocator는 list처럼 단일 메모리 할당 및 해제가 일어나는 STL 컬렉션에서 성능이 좋습니다.

이 외의 설명은 아래 예제를 살펴본 후에 하겠습니다.

#define BOOST_POOL_NO_MT
#include <boost/pool/pool_alloc.hpp>
#include <vector>
#include <list>

using namespace std;

int main(int argc, char* argv[])
{
	typedef boost::pool_allocator<int> allocator;
	typedef boost::fast_pool_allocator<int> fast_allocator;

	typedef boost::pool_allocator<int,
		boost::default_user_allocator_new_delete,
		boost::details::pool::default_mutex,
		64, 128> allocator2;
	typedef boost::fast_pool_allocator<int,
		boost::default_user_allocator_new_delete,
		boost::details::pool::default_mutex,
		64, 128> fast_allocator2;

	std::vector<int, allocator> test_vector;
	std::list<int, fast_allocator> test_list;

	boost::singleton_pool<boost::pool_allocator_tag, sizeof(int)>::purge_memory();
	boost::singleton_pool<boost::fast_pool_allocator_tag, sizeof(int)>::purge_memory();

	return 0;
}

예제에서 #define BOOST_POOL_NO_MT는 boost의 pool 관련 부분이 멀티쓰레드가 아닌 싱글쓰레드를 사용하겠다는 #define입니다. 해당 #define을 사용하여 싱글쓰레드 프로그램에서 성능을 높일 수 있습니다. allocator2와 fast_allocator2는 복잡한 템플릿 인자 버전을 보여주어 설정할 수 있는 것들을 보여주려고 했습니다. 해당 메모리 할당자를 다 사용한 후에는, 아마도 프로그램 종료시에, 프로그램의 끝에서 purge_memory()를 해주어 메모리를 정리하여야 합니다. 이때 템플릿 인자로 allocator관련하여 _tag를 붙인 인자를 넘겨준다는 것에 주의하여야 합니다.


반응형