2010년쯤 되면, 기본 사양이 쿼드코어 시대를 맞이하게 될 것이다. 이것은 멀티 쓰레드 환경이 얼마나 가까이 왔는지 보여주는 증거이기도 하다. 이런 시대에 맞추어, 프로그래머는 멀티 쓰레드 환경에서 더 빨리 돌아가도록 설계하고 만들어야 할 것이다. 13, 14, 15 항목에서 설정했던 모든 것들이, 멀티 쓰레드에서 어떻게 동작을 하게 될까? ... 쓰레드를 생각하면 복잡해 지는 로직 속에서 우리는 "동기화 객체(Sync Object)"를 만들어서, 각 쓰레드를 동기화 시키려고 할 것이다. 하지만 이 "동기화 객체"를 사용 하면, 적지 않은 비용을 내야 할 것 이다. 이번 항목은 13,14,15 항목에서는 멀티쓰레드 환경에서의 최적화로 String 클래스를 정의 하는 방법을 이야기 한다. 시작 부터 말하..
책 정리/More Exceptional C++ 검색 결과
항목 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..
이번 항목에선 inline을 언제 사용 해야 되는지에 대한 논쟁이다. 대부분 inline을 과용 하고 있어, 문제가 될 소지가 많이 있다고 허브셔터는 지적한다. 허브 셔터는 3개의 질문을 통해서 한번 생각해 보라고 한다. 1. inline이 하는 일은? 함수를 inline으로 만들면 컴파일러는 함수가 쓰이는 곳마다 함수의 코드를 직접 복사해서 붙인다. 이렇게 되므로써, 컴파일러는 함수 호출 코드를 만들지 않고 함수를 마음껏 실행 할 수 있다. 2. inline 함수를 만들면 효율성이 높아지나? 꼭 그런 것만은 아니다. 만약 여기서 "무엇을 최적화 하려 하는가?"를 질문하지 않았다면, 바로 함정에 빠진것이라고 한다. 왜냐하면 inline의 효율은 함수 호출 비용만 줄여 줄 수 있을 뿐이기 때문이다. a )..
public 상속의 막강한 힘은 해본 사람만이 안다. DX 리소스 매니저를 만들 었을 때, 리소스 매니저의 리소스를 상속한 버텍스와 텍스쳐 등을 다형성으로 제어 하고, 사용 할 때, public 상속은 정말 깔끔함을 선사해 준다. 이번 항목을 이런 다형성을 제어하는데 초점을 맞춘다. 예제 코드를 보자. #include class Base { public: virtual void VirFunc() const { std::cout
최근댓글