프로그래밍/c++
-
vector와 map에서의 end, 반복자의 성격.프로그래밍/c++ 2016. 4. 2. 16:54
vector의 end는 데이터를 추가적으로 삽입한 이후(push_back) 이전 end는 무효화가 되죠?반면 map은 end가 어느 시점에서의 end던 항상 컨테이너 요소의 끝을 의미하기에,이 부분에 대한 명확한 스펙이 있는지 궁금했습니다. 코드로 보자면, 1234567891011121314vector vec;auto end0 = vec.end(); for(int i = 0; i != 100; ++i){ vec.push_back(i);} auto end1 = vec.end(); if(end0 == end1){ // 같지 않음!}cs 는 같지 않은 반면, 1234567891011121314 std::map dic; auto end0 = dic.end(); for (int i = 0; i != 100; ++..
-
boost::pool_allocator와 boost::fast_pool_allocator의 차이프로그래밍/c++ 2016. 2. 28. 08:23
boost 1.6 버전 기준이다. boost::pool_allocator는 정렬된 할당/해제를 사용하는 반면, boost::fast_pool_allocator는 정렬되거나 정렬되지 않은 할당/ 정렬되지 않은 해제를 사용한다. 정렬되지 않은 할당/해제는 메모리 노드의 끝 부분에 메모리를 하나 추가하면 그만이지만,정렬된 할당/해제의 경우 이전 메모리를 찾는 과정이 필요하고 이 부분에서 부하가 생길 수 있다.다만 정렬된 할당/해제의 경우 연속된 메모리(가변, new int[10]과 같은!)를 지원하기 때문에 사용처에 따라 잘 구분을 해야할 것이다. boost::pool_allocator의 allocate / deallocate 123456789101112131415161718192021222324// pool..
-
boost/pool을 멀티 스레드 환경에서 제대로 활용하려면..프로그래밍/c++ 2016. 2. 28. 05:56
boost::pool_alloc과 boost::singleton_pool boost/pool은 멀티 스레드 환경에서 느리다는 인식이 있다. boost::pool_alloc은 내부적으로 boost::singleton_pool을 사용하며, singleton_pool은 멀티 스레드 환경에서의 동기화를 위해 할당/해제에 스레드 락이 있기 때문에 할당 테스트에서는 기본 메모리 할당자보다 안 좋은 퍼포먼스를 보이지만, 할당=>해제=>할당 식으로 테스트를 한다면 기본 할당자보다는 좋은 성능을 보인다. 그렇다면 일단 전역적인 풀로도 ok다. 풀이 필요한 환경이라면 어차피 할당=>해제=>할당=>해제 의 과정이 빈번하기 때문인데 이러한 환경에서는 전혀 문제될 것이 없음을 의미한다. 그럼 일단 singleton_pool은 ..
-
std::put_time프로그래밍/c++ 2016. 2. 1. 20:34
http://www.cplusplus.com/reference/iomanip/put_time/ 예제1234567891011121314151612345678910111213141516// put_time example#include // std::cout#include // std::put_time#include // std::time_t, struct std::tm, std::localtime#include // std::chrono::system_clock int main (){ using std::chrono::system_clock; std::time_t tt = system_clock::to_time_t (system_clock::now()); struct std::tm * ptm = std::l..
-
boost::pool_allocator는 생각만큼 빠르지 않다?프로그래밍/c++ 2016. 1. 23. 08:09
간단한 코드를 보자!하나는 boost::pool_allocator로 부터 shared_ptr 할당을, 하나는 기본 new 연산자로 shared_ptr 할당을 한 것이다. 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980#include #include #include #include #include using namespace std; struct obj{ int a; int b; int c;}; using pool_allocator_type = boost::pool_allocator;s..
-
boost::property_tree를 이용해 xml 데이터 파싱하기프로그래밍/c++ 2016. 1. 22. 06:47
서버의 설정 값들을 텍스트 파일로 두고 읽어오는 방식을 사용했으나 좀 더 체계화된 방식이 있으면 좋겠다고 생각했다. 이유는 매번 텍스트 파일의 양식을 정의해야 했으므로, 해당 양식에서 데이터를 뽑아낼 수 있는 파서를 직접 만들어 써야 했으며, 값 만을 저장하는 경우 사람이 보기에 직관적이지가 않아 수정이 어려웠다. 근데 우성이형이 그런 것들을 xml로 하면 좋다고 해서 c++에서의 이용 방법들을 알아봤고, 역시나 boost에도 xml parser가 있었다. 123456789101112131415161718192021222324252627282930 #include //... namespace property_tree = boost::property_tree; property_tree::ptree read..
-
boost::lockfree::spsc_queue 사용 시 주의할 점프로그래밍/c++ 2016. 1. 18. 05:43
trivial 타입만 사용할 수 있음 struct buffer_info // trivial type { void* buffer; size_t length; }; struct buffer_info_2 // non trivial type { buffer_info(void* buffer, size_t length) : buffer{buffer}, length{length} { } }; 초기화 시 지정된 크기로만 사용 가능. 초기화 시 버퍼 크기를 10개로 지정했는데, 10개를 초과해서 집어 넣을 순 없다. boost::lockfree::spsc_queue queue{ 10 }; for(size_t i = 0; i != 11 /* error! */; ++i) { queue.push(i); }
-
boost pool_allocator 분석프로그래밍/c++ 2016. 1. 14. 23:30
부스트 풀 메모리 할당자 헤더 #include 특징 스레드에 안전함 rebind 지원가변 크기 지원 pool_allocator vector와 같은 연속적인 메모리를 가지는 자료형 할당에 적합한 할당자. 내부적으로 singleton_pool을 사용하고, singleton_pool은 pool을 전역적으로 사용할 수 있도록 만든 클래스 pool_allocator::allocate 호출 시 다음과 같은 호출 과정을 거침 pool::ordered_malloc 내부 123456789101112131415template void * pool::ordered_malloc(const size_type n){ //! Gets address of a chunk n, allocating new memory if not alr..