C++
-
asio io_service의 dispatch가 post와 다른 점과 적절한 사용처프로그래밍/c++ - boost::asio 2016. 5. 1. 02:45
post()와 dispatch()의 차이 post()는 단순히 핸들러를 io_service 내부에 추가, dispatch()는 호출될 때 호출 스레드 io_service:: run(), poll() 등을 통해 실행되었다면 dispatch한 핸들러를 io_service 내부에 추가하지 않고, 즉시 실행. 그렇다면 dispatch가 호출되는 게 io_service를 통해서가 아니라면 어떨까? post처럼 io_service 내부에 추가된다. 코드로 보자면..12345678910111213141516171819202122int main(){ using namespace boost::asio; io_service proactor; boost::thread_group threads; for(int i = 3; i..
-
함수에 주석 달기에 대한 생각프로그래밍/c++ 2016. 4. 24. 16:26
코딩을 하는데 함수 시그니쳐만으론 어떤 예외가 발생하는지 통 알 수가 없으니, std::exception으로 모든 예외를 잡는 상황이 종종 있었다. boost의 소스 코드는 발생하는 예외에 대해선 @throws [발생하는 예외의 종류] 같은 식으로 명시를 해놓았더라. 덕분에 어떤 예외가 발생하는지 파악하기 쉬웠다. 아쉬운 점이라면, 주석이 너무 빡빡하다는 점. 디테일한 설명을 하는 것도 장점도 있으니 이 부분은 취향 차이라고 본다. 나도 이 부분을 본받아서 주석을 달면 좋겠다는 생각을 했다. 이런식으로 주석을 작성하면, ide 단에서 함수의 설명은 다음과 같이 나온다. 그리고, ide 단에서 발생하는 예외에 대해서도 표시를 해줬으면 좋겠다. 지금 막 작성하는 코드에도 주석을 꼼꼼히 달면서 하긴 어려운데,..
-
iostream cerr, clog의 사용프로그래밍/c++ 2016. 4. 5. 20:32
cerr와 clog는 기본적으로, 콘솔로 출력해 이게 cout이랑 뭐가 다른 거야?! 라고 하겠지만스트림버퍼 설정으로 손 쉽게 에러와, 로그를 구분해 출력할 수 있도록 한다. 1234std::ofstream outfile("err.txt"); // set output streamstd::cerr.rdbuf(outfile);cs 이렇게 rdbuf를 재설정 하면, cerr로 출력한 문자들은 모두 outfile에 쓰여지게 된다! 123 std::cerr
-
c++] 시스템의 환경 변수 얻기 std::getenv프로그래밍/c++ 2016. 4. 4. 16:55
http://en.cppreference.com/w/cpp/utility/program/getenv std::getenv C++ Utilities library Program support utilitiesDefined in header char* getenv( const char* env_var );Searches the environment list provided by the host environment (the OS), for a string that matches the C string pointed to by env_var and returns a pointer to the C string that is associated with the matched environment list memb..
-
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은 ..
-
[c++] static 변수의 초기화 시점프로그래밍/의문 2016. 2. 22. 09:09
함수의 정의된 static 객체 => 함수가 처음 호출되는 시점에 인스턴싱 123456static any_class& get(){ static any_class instance; return instance;} cs 클래스에 정의된 static 객체 => 명확한 스펙이 없음 12345class any_class{//... static any_value value;};cs 따라서 정적 메모리에 존재하는 변수들의 초기화 시점을 제제하는 유일한 방법은 모든 정적 메모리 변수를 하나의 변환 단위에 넣어주며, 헤더에 모두 extern 키워드를 사용하는 방법이 최선이다. 출저 more effective c++ http://en.cppreference.com/w/cpp/language/initialization