책 정리 검색 결과
템플릿 특수화란? 템플릿 매개변수에 따라 컴파일러가 템플릿 코드 선택해 줄수 있게 해주는 기법을 말한다. 템플릿 특수화는 여러가지 용도로 사용 되는데, 포인터 타입이 들어오거나, 특정 타입을 받았을 경우, 특수화된 템플릿이 인스턴스화 되게 할 수 있다. 굳이 비교를 하자면, C 언어의 if 문 같은 녀석이다. (메타 프로그래밍에선 이 특수화를 감칠맛 나게 응용한다.) 템플릿 특수화를 어떻게 만드나? 예제코드를 보자. #include // 일반 클래스 템플릿 template class ikpil { public: ikpil() { using namespace std; cout
2010년쯤 되면, 기본 사양이 쿼드코어 시대를 맞이하게 될 것이다. 이것은 멀티 쓰레드 환경이 얼마나 가까이 왔는지 보여주는 증거이기도 하다. 이런 시대에 맞추어, 프로그래머는 멀티 쓰레드 환경에서 더 빨리 돌아가도록 설계하고 만들어야 할 것이다. 13, 14, 15 항목에서 설정했던 모든 것들이, 멀티 쓰레드에서 어떻게 동작을 하게 될까? ... 쓰레드를 생각하면 복잡해 지는 로직 속에서 우리는 "동기화 객체(Sync Object)"를 만들어서, 각 쓰레드를 동기화 시키려고 할 것이다. 하지만 이 "동기화 객체"를 사용 하면, 적지 않은 비용을 내야 할 것 이다. 이번 항목은 13,14,15 항목에서는 멀티쓰레드 환경에서의 최적화로 String 클래스를 정의 하는 방법을 이야기 한다. 시작 부터 말하..
항목 14에서 실제로 쓸 때, 실제 객체를 만드므로써, 복사 자체를 지연 시킴을 보았을 것이다. 이번 항목에선 operator[] 를 이용해서 사용 되어 질 경우에 생각해야 할 "거리"를 준다. 다음 코드를 보자. namespace Optimized { class StringBuf { private: // 복사 방지 StringBuf( const StringBuf& ); StringBuf& operator=( const StringBuf& ); public: StringBuf(); ~StringBuf(); void Reserve( size_t n ); public: char *buf_;// 버퍼 size_t len_;// 버퍼의 길이 size_t used_;// 실제로 사용된 char의 수 unsigne..
항목 13에서 보여주었던 String 클래스에는 큰 문제(..)는 없으나, 문자열 특성상 복사만 하고 삭제 되는 경우가 있기 때문에, 불필요한 복사가 이루어 진다고 볼 수 있다. 여기서 생각해 볼 만한 사항은, 어떻게 하면, 문자열의 내부가 변경 되어 질 경우에만, 실제 복사가 이루어 지게 하고, 아닐 경우에는 문자열만 공유 되게 할 수 있는가? 이다. 다음 코드를 보자! namespace Optimized { class StringBuf { public: StringBuf();// 빈 채로 시작 ~StringBuf();// 버퍼 지우기 void Reserve( size_t n );// len >= n인지 확인 char *buf_;// 버퍼 size_t len_;// 버퍼의 길이 size_t used_;..
이번 항목은 최적화 시리즈 중에서 복사 미루기를 통하여, 성능을 향상 시키는 방법을 이야기 하고 있다. 그 예제로 허브셔터는 문자열 클래스를 만들어 보기로 한다. 아래 코드를 보자. namespace Original { class String { public: String();// 빈 채로 시작 ~String();// 버퍼 지우기 String( const String& );// 완전한 복사본 받기 void Append( char );// 문자 하나 붙이기 // ... operator= () 등 생략 ... private: char *buf_;// 할당된 버퍼 size_t len_;// 버퍼의 길이 size_t used_;// 실제로 사용된 char의 수 }; } 자, 이 코드에서 Original::Str..
최근댓글