프로그래밍
-
join의 유용함을 느낌일상/잡담 2016. 8. 14. 19:00
sql을 다루는 게 익숙하지 않아, join이라는 게 있다는 것만 알았지 어떤 상황에서 쓰면 유용하다! 이런걸 마음 깊숙한 곳에선 느끼지 못했다. 그러나 최근 지인이 사용할 간단한 회원 관리 프로그램을 만들어보면서 이런 상황이 있었다. 상황 >> 0. 테이블은 TIME, MEMBER로 나뉘어져있다.1. TIME은 타임 아이디 만료일(EXPDATE), 남은 시간등의 컬럼을 가진다.2. MEMBER는 회원 이름, 타임 아이디를 가진다.3. 그리고 시간의 만료일이 지난 회원들을 검색한다. join을 사용하기 전에는 TIME 테이블에서 만료된 TIME을 가져온다. 타임 아이디와 일치하는 회원들을 가져온다. 둘을 합쳐서 보여준다. 를 따로따로 했었고 이는 코드로 대략 이런식으로 표현이 되었었다. 그리고 join을..
-
boost::variant(std::variant c++17) 사용하기프로그래밍/c++ 2016. 8. 5. 03:38
boost::variant는 n개의 타입이 될 수 있는 타입이다. boost::any와의 차이점은 지정된 형태로만 될 수 있으며 any와는 다르게 타입 변환 시 동적 할당을 사용하지 않기 때문에 퍼포먼스가 좀 더 뛰어나다. boost::variant는 n개의 타입이 될 수 있는 타입이다. union의 c++판 업그레이드 버전 정도 되는 라이브러리라고 생각해도 괜찮다. 또, c++17에 표준으로 포함 되었으며 c++ 관련 커뮤니티에서의 반응도 긍정적이다. 일단 사용하는 방법이 깔끔하고 쉬우니까.코드 >>#include boost::variant var; // setvar = 0.01;var = 123;var = "hello"; // getstd::string s = boost::get(var); 값을 얻을..
-
비쥬얼 스튜디오에 tcmalloc 간단 적용프로그래밍/의문 2016. 7. 22. 15:15
Google 퍼포먼스 툴 다운로드 https://code.google.com/p/gperftools/ Zip 파일 압축 해제 후 gperftools.sln 실행 libtcmalloc_minimal 프로젝트 빌드 만들어진 dll과 lib를 복사한다. 프로젝트를 만들고, lib 파일을 포함하고 링크 심볼을 정의해준다. #pragma comment(lib, "libtcmalloc_minimal")#pragma comment(linker, "/include:__tcmalloc") 이렇게 하면 기존의 메모리 할당(malloc이나 new 같은)이 내부적으로 tcmalloc을 사용하도록 대체를 한다는데.. 적용이 매우 간편하다는 점이 매력적이다. ++ 2018-04-18 #pragma comment를 이용하지 않고 ..
-
boost::any에서의 unsafe_any_cast프로그래밍/c++ 2016. 6. 6. 22:54
any_cast는 유도리가 없다. int로 넣은 것을 size_t로 읽으려고 하면 예외를 던진다. 실제 코딩을 함에 있어서도 int => unsigned int size_t => int같은 변환은 빈번한데, 안전한 캐스팅만을 보장해주는 any_cast가 야박하고 느꼈다면 unsafe_any_cast의 사용을 고려할 만 하다. 함수 시그니쳐 12345template const ValueType* unsafe_any_cast(const boost::any* operand) template ValueType* unsafe_any_cast(boost::any* operand)cs 사용 12345boost::any val = 1; boost::any_cast(val); // error! boost::unsafe_..
-
alignas, alignof 키워드프로그래밍/c++ 2016. 5. 7. 21:20
alignas 메모리의 정렬 단위를 지정하는 키워드로, 다음과 같이 사용합니다.(c++11 이상) 123456789101112131415161718// 4 바이트 단위로 정렬된 구조체struct alignas(4) foo{ int a; int b; char c;}; // 8 바이트 단위로 정렬된 구조체struct alignas(8) bar{ int a; int b; char c;}; sizeof(foo) // 결과는 12sizeof(bar) // 결과는 16cs 클래스, 구조체/공용 구조체 또는 개별 멤버에 alignas를 사용 가능하며 여러 alignas 지정자가 있을 경우, 컴파일러는 가장 엄격한 지정자(가장 큰 값의 지정자)를 선택합니다. 12345678910struct alignas(16) bar..
-
c++11과 14의 brace-or-equal-initializer프로그래밍/c++ 2016. 5. 3. 16:33
c++11 표준에 추가된 brace or equal initializer 코드로 보자면 이런 거다. 12345678910 // c++11에선 not aggregate type// c++14에선 aggregate typestruct flag{ const int bit = 0; const wchar_t* name = L""; const int sign = 0;}; cs 위의 코드는 c++11에서는 유효하지만 aggregate 타입이 아니게 된다는 애매한 부분이 생긴다. 그러나 c++14 표준부터 위 코드 역시 aggregate 타입이 되며 c++14부턴 아래 코드 컴파일에 성공한다. 1234 // c++14 표준에선 성공, c++11 표준에선 실패flag f{ 1, "hello", 1 }; cs 이에 대한 ..
-
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..