목록분류 전체보기 (77)
로또
std::chrono를 사용할 일이 생겼는데, 공부를 하면서 내용을 정리해보았다. 검색하면서 가장 많이 볼 수 있는 예제이다.std::chrono::system_clock::time_point tpStart = std::chrono::system_clock::now(); 실행 시 tpStart의 디버그 값은 다음과 같다. 하나씩 차차 정리해보자.값: {_MyDur={_MyRep=17302558967071507 } }형식: std::chrono::time_point>> time_point란 무엇인가?MS 문서에 따르면 다음과 같이 정의되어 있다.template class time_point;Clock과 Clock::duration type을 받아서 생성되는 클래스이고, 코드를 좀 더 살펴보면 다음과 같은 ..
다루는 내용 예제를 통해 컴파일러가 말하는 경고와 우리가 이해하는 바가 다를 수 있음을 깨닫고, 컴파일러 경고를 다루는 올바른 자세를 알아보자. 컴파일러 경고 예제 #include using namespace std; class B{ public: virtual void f() const {cout
다루는 내용 위치지정 new/delete가 무엇인지, new와 delete를 짝지어주어야 하는 이유가 무엇인지 알아보고 이름 가림을 유용하게 해결하는 방법에 대해서도 알아보자. 위치지정 new란? operator new 함수의 기본적인 형태는 다음과 같다. 출간된 지 오래된 책이라 throw와 관련하여 문법적인 차이가 있음을 명심하자. void* operator new(std::size_t) throw(std::bad_alloc); operator new 함수는 기본형과 달리 매개변수를 추가로 받는 형태로도 선언할 수 있다. 이러한 형태의 함수를 위치지정(placement) new 라고 일컫는다. 위치지정 new는 개념적으로 "추가 매개변수를 받는 new"이다. 매개변수를 추가로 받는 new 버전 중 C..
다루는 내용 operator new와 delete를 작성할 때 반드시 지켜야 하는 점을 알아보자. 또한 operator new와 delete에 대한 클래스 버전을 만들 때 주의해야 할 점을 다룬다. operator new의 요구사항 제대로 된 반환값을 가져야 한다. 가용 메모리가 부족할 경우에는 new 처리자 함수를 호출해야 한다. 0바이트 메모리 요청에 대한 대비책을 갖춰두어야 한다. 기본 형태의 new가 가려지지 않아야 한다. 이러한 요구 사항을 의사 코드로 나타내면 다음과 같다. void* operator new(std::size_t size) { using namespace std; if(size == 0) size = 1; while(true){ // size byte 할당 성공 if(할당 성공..
기본 제공 new / delete를 바꾸고 싶은 이유 1. 효율을 향상시키기 위해 기본 제공 new / delete는 대체적으로 일반적인 쓰임새에 맞추어 설계되었다. 웹 서버처럼 실행 기간이 긴 프로그램에서도, 굉장히 짧은 프로그램에서도 문제가 발생하지 않아야 한다. 메모리 블록을 크게 할당하든 작은 블록만 할당하든 섞어서 할당하든 간에 메모리 할당 요청을 무난하게 처리해야 하며 오랜 시간 사용될 메모리 블록이나 단시간 사용될 수 많은 메모리 블록을 할당, 해제하는 작업과 같이 여러 가지 유형을 소화할 수 있어야 한다. 또한 힙 단편화에 대한 대처 방안도 갖고 있어야 한다. 이처럼 기본 제공 new / delete는 어느 누구에게나 적당히 무난하게 동작하지만 어느 누구에게도 특별히 칭찬받지 못한다. 개발..
다루는 내용 new 처리자가 무엇인지, 어떻게 사용하는지에 대해 다룬다. new 처리자란? 메모리 할당을 성공적으로 수행할 수 없을 때, operator new가 예외를 던지기 전에 호출되도록 사용자가 지정할 수 있는 에러 처리 함수를 new 처리자(new-handler, 할당에러 처리자)라고 한다. 사용자가 new 처리자를 지정할 수 있도록 표준 라이브러리에는 set_new_handler 라는 함수가 에 다음과 같이 준비되어있다. namespace std { typedef void (*new_handler)(); new_handler set_new_handler(new_handler p) throw(); } new_handler는 받는 것도, 반환하는 것도 없는 함수 포인터 타입 동의어이다. set_n..
다루는 내용 템플릿의 사용으로 인해 발생할 수 있는 문제인 코드 비대화에 대해 알아보고, 이를 해결하는 방법에 대해 알아보자. 템플릿과 코드 비대화(Code Bloat) 템플릿의 사용은 코딩 시간 절약과 코드 중복 회피를 가능하게 해준다. 하지만 주의를 기울이지 않고 템플릿을 사용할 경우 코드 비대화를 초래할 수 있다. 코드 비대화란, (거의) 똑같은 내용의 코드와 데이터가 중복되어 이진 파일로 생성되는 것을 말한다. 소스 코드에서 우리가 눈으로 확인할 수 있는 명시적인 중복이 없어도 목적 코드에서 템플릿의 사용으로 인한 암시적인 중복은 존재할 수 있다. 코드 비대화 문제를 해결하기 위해 공통성 및 가변성 분석(Commonality and Variability Analysis)을 하여야 한다. 이는 코드..
다루는 내용 기본 클래스 템플릿 함수에 접근할 때 발생할 수 있는 문제점과 그 해결 방법에 대해서 알아보자. 기본 클래스 템플릿의 함수 호출 문제 회사 별로 클래스를 두어 메세지를 전송하는 응용 프로그램의 예제이다. 각 Company 클래스에서 SendClearText 함수로 메세지 원문을 보낼 수도 있고, SendEncrypted 함수로 암호화된 메세지를 전송할 수도 있다. #include using namespace std; // 기업 별 클래스 class CompanyA{ public: void SendClearText(const string& msg){} void SendEncrypted(const string& msg){} }; class CompanyB{ public: void SendClea..
다루는 내용 사용 위치에 따른 typename의 용도를 알아보자. 템플릿 선언문에서 class와 typename의 차이점 template class Widget; template class Widget; 템플릿의 타입 매개변수를 선언할 때에는 class와 typename의 뜻이 완전히 똑같다. 물론, 코드를 작성하는 사람마다 취향 차이가 나타날 수 있다. 항상 짧은 길이의 class를 선호하기도 하고 매개 변수가 클래스 타입일 필요가 없다며 typename을 선호하는 사람도 있을 것이다. 혹은 모든 타입이 허용되는 경우에는 typename을, 사용자 정의 타입만 사용하는 경우에는 class를 사용하는 사람도 있을 것이다. 의존 이름과 비의존 이름 template void Print2nd(const C& ..
다루는 내용 템플릿 프로그래밍에서 사용되는 개념인 암시적 인터페이스와 컴파일 타임 다형성에 대해 알아보자. 명시적 인터페이스와 런타임 다형성 // Widget.h class Widget{ public: Widget(); virtual ~Widget(); virtual std::size_t size() const; virtual void normalize(); void swap(Widget& widget); ... }; void DoProcessing(Widget& w){ if(w.size() > 10 && w != some_nasty_widget){ Widget temp(w); temp.normalize(); temp.swap(w); } } 명시적 인터페이스(explicit interface) 소스 코드..