항목 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 )..
C++ 에서 함수의 기본 매개변수를 정하는 방법이 있다. 그 방법은 대부분 알고 있으므로 패스하고, C++ 템플릿 매개변수도 "기본 템플릿 매개변수"가 있다는 것만 알고 잇으면 된다. 이야기 진행 상 밑에서 설명 한다. C++ 템플릿은 함수 템플릿과 클래스 템플릿, 이 두개에서 템플릿을 구사 할 수 있는데, 기본 템플릿 매개변수는 클래스 템플릿에서만 적용이 된다. 어떻게 기본 템플릿 매개변수를 사용 할 수 잇는가? 예제코드 template class DefaultTemplateParameter { }; 그 사용 방법은 C++ 함수와 똑같다. 이렇게 만든 클래스 템플릿의 경우, C++ 함수 기본 매개변수와 같이, 생략되어서 사용 될 경우, 기본적으로 정해준 매개변수에 의하여 초기화가 이루어 진다. 총평 따..
앞서 일반 for문을 알아 보았다면, 일반 for문에서 보유한 3개의 변수 중 첫번째 함수 변수가 반복자 생성 함수(클로저)에서 뽑아낸 반복자와 틀리다는 것을 알 수 있을 것이다. 루아에선 for문의 함수 변를 "무상태 반복자 : Stateless Iterators" 라 부른다. 이 무상태 반복자는 클로저에서 처럼 반복자 내부 모두 처리하는 것은 아닌, 외부의 인자로 내부의 연산을 수행하는 함수를 가리킨다. 좋은 점은 for 문이 사라지면, 자동으로 stack에서 이 외부 변수를 사라지게 됨으로 최적화가 되어 지는 것으로 보여 진다(.. 물론 추측이다.) 일반 for문의 함수 변수에 이 무상태 반복자 함수를 할당하는게 더 좋다고 하니까, 이 규칙만 알고 넘어가자. 총평 .. 개념 이해..
최근댓글