목록전체 글 (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는 어느 누구에게나 적당히 무난하게 동작하지만 어느 누구에게도 특별히 칭찬받지 못한다. 개발..