블로그 이미지
이태원에서 사는 다섯식구의 무직 가장. 흰둥에미

카테고리

분류 전체보기 (184)
Itaewon (2)
ryu's?? (1)
20121210이전 (20)
20130827이전 (147)
soo'study (13)
Total37,728
Today0
Yesterday22

'effective c ++'에 해당되는 글 14건

  1. 2012.12.21 항목 13 - 17 (1)
  2. 2012.12.21 항목 9 - 12
  3. 2012.12.18 항목 5 - 8
  4. 2012.12.18 항목 1 - 4

항목 13 - 17

20130827이전/EC++ / 2012.12.21 14:45

이제부터 자원관리..


항목 13. 자원 관리에는 객체가 그만.

            특정 자원이 반드시 해제되도록 만들 방법은, 자원을 객체에 넣고 그 자원 해제를 객체의 소멸자에게 맡긴다.

            자원 획득 즉 초기화(RAII), 소멸자를 이용한 자원 해제

            대표적으로 smart pointer, reference-counting smart pointer

            단 동적 배열의 포인터를 스마트 포인터에 넘기는건 안됨. 잘못된 소멸자가 호출됨.


항목 14. 자원 관리 클래스의 복사 동작에 대해 진지하게 고찰하자.

            RAII 객체가 복사될 때,

            (1) 복사를 금지한다. (2) 관리하고 있는 자원에 대해 참조 카운팅을 수행한다. <- 주로 이 두가지를 사용.

            (3) 관리자원을 진짜로 복사. (4) 관리자원의 소유권을 옮김


항목 15. 자원 관리 클래스에서 관리되는 자원은 외부에서 접근할 수 있도록 하자.

            RAII클래스가 관리하는 실제 자원으로의 변경

            명시적 변환 함수 - getter 함수의 구현

            암시적 변환 함수 - oerator TYPE() const { return f; } -> 의도치 않은 타입 변환이 일어날 여지가 있음.


항목 16. new 및 delete를 사용할 때는 형태를 반드시 맞추자.

            new는 delete로, new[]는 delete[] 로 합시다.

            아니면 편하게 stl 컨테이너를 써라.


항목 17. new로 생성한 객체를 스마트 포인터에 저장하는 코드는 별도의 한 문장으로 만들자.

            예외 발생 시 디버깅하기 힘든 자원 누출이 발생할 수 있음.

'20130827이전 > EC++' 카테고리의 다른 글

항목 22 - 25  (0) 2012.12.22
항목 18 - 21  (0) 2012.12.21
항목 13 - 17  (1) 2012.12.21
항목 9 - 12  (0) 2012.12.21
항목 5 - 8  (0) 2012.12.18
항목 1 - 4  (0) 2012.12.18
Posted by 흰둥에미

항목 9 - 12

20130827이전/EC++ / 2012.12.21 14:16

항목 9. 객체 생성 및 소멸 과정 중에는 절대로 가상 함수를 호출하지 말자.

           상속된 클래스의 생성, 소멸의 순서에 대해서 잠시 생각해보면, 어느 시점에 어떤 가상 함수가 호출될지를 알 수 있다.


항목 10. 대입 연산자는 *this의 참조자를 반환하게 하자.

            대입 연산 - right-associative


항목 11. operator=에서는 자기대입에 대한 처리가 빠지지 않도록 하자.

            w = w, a[i] = a[j], *px = *py 등이 자기대입이 발생할 수 있음(중복 참조에 의해)

            if (this == &rhs) return *this;

            위의 경우 분기가 발생하므로, 실행 시간 속력이 느려질 수 있음.

            this를 잠시 두고, rhs로 새 객체를 생성한뒤, this에 넣고 원래의 this는 삭제.


항목 12. 객체의 모든 부분을 빠짐없이 복사하자.

            복사 생성자와 복사 대입 연산자를 의미.

            (1) 해당 클래스의 데이터 멤버를 모두 복사, (2) 이 클래스가 상속한 기본 클래스의 복사 함수도 꼭 호출.

            복사 생성자와 복사 대입 연산자를 한쪽을 이용해 다른쪽을 구현하지 말라, 공통의 작업은 함수로 떼어내 호출하게 하라.

'20130827이전 > EC++' 카테고리의 다른 글

항목 22 - 25  (0) 2012.12.22
항목 18 - 21  (0) 2012.12.21
항목 13 - 17  (1) 2012.12.21
항목 9 - 12  (0) 2012.12.21
항목 5 - 8  (0) 2012.12.18
항목 1 - 4  (0) 2012.12.18
Posted by 흰둥에미

항목 5 - 8

20130827이전/EC++ / 2012.12.18 17:07

항목 5. C++가 은근슬쩍 만들어 호출해 버리는 함수들에 촉각을 세우자.

          사용자 정의 클래스에 기본 생성자(basic constructor), 복사 생성자(copy constructor), 복사 대입 연산자(copy assignment

          oerator), 소멸자(destructor)가 선언되어 있지 않았다면, 필요에 의해 컴파일러가 생성합니다.

          멤버 데이터로 포인터, 레퍼런스 등이 있을 때, 특히 사용자가 직접 구현하여 적절한 동작을 정해주는 것이 좋다.


항목 6. 컴파일러가 만들어 낸 함수가 필요 없다면, 확실이 이들의 사용을 금하자.

         private 으로 항목 5의 함수들을 선언'' 함으로써, 해당 함수가 호출되는 코드의 컴파일시 에러가 나게 해줌.

         boost의 noncopyable 클래스를 이용해도 좋음.


항목 7. 다형성을 가진 기본 클래스에서는 소멸자를 반드시 가상 소멸자로 선언하자.

         말인 즉슨, 부모 클래스의 포인터를 이용해 사용하고 삭제되는 객체들의 부모 클래스는 소멸자에 virtual을 붙여 주자는 것이다. 

         순수 가상 소멸자는 추상 클래스를 위해 선언한다. 단 구현도 있어야함.


항목 8. 예외가 소멸자를 떠나지 못하도록 붙들어 놓자.

          소멸자에서 발생한 예외를 내버려 두면, 프로그램 종료나 미정의 동작을 일으킬 수 있음.

          try-catch 문을 이용해, 프로그램을 끝내거나 예외를 삼켜 소멸자가 온전히 수행되게 한다.

'20130827이전 > EC++' 카테고리의 다른 글

항목 22 - 25  (0) 2012.12.22
항목 18 - 21  (0) 2012.12.21
항목 13 - 17  (1) 2012.12.21
항목 9 - 12  (0) 2012.12.21
항목 5 - 8  (0) 2012.12.18
항목 1 - 4  (0) 2012.12.18
Posted by 흰둥에미

항목 1 - 4

20130827이전/EC++ / 2012.12.18 14:46

읽어도 읽어도 익숙해 지지 않는 책인 EC++을 내 코드에 녹아 내릴때까지 읽어보고 정리하자..


항목 1. C++은 언어들의 연합체 - C++는 베이스인 C, 객체지향 개념의 C++, 템플릿 C++, STL 등의 연합체로,

          효과적인 프로그램 개발을 위해서는 적재적소에 필요한 기능 또는 하위 언어들을 사용해야한다.

항목 2. #define을 쓰려거든 const, enum, inline을 떠올리자 - 프로프로세서 보단 컴파일러를 더 가까이 하자가 요지.

           (1) define을 상수로 교체 할 때, 1. 상수 포인터를 정의할 땐, 포인터와 그 대상까지 const로 지정하자.

                                                       2. 클래스 상수의 사본이 생성되지 않게, static을 사용하자.

           (2) 컴파일 타임에 멤버 상수가 필요한 경우, enum { count=10 }; 의 구문을 사용할 수 있음(enum hack)

                선언한 정수 상수를 다른 사람이 주소를 얻는다던가 참조자를 쓴다던가 하는 것을 방지할 수 있음. 

           (3) define 매크로로 만들어 낸 함수는 특정상황에 버그를 생산할 가능성이 농후, inline template 함수로 극복 가능.

 항목 3. 낌새만 보이면 const를 들이대 보자.

            '의미적인 제약'을 소스 코드 수준에서 붙인다는 점과, 컴파일러가 이 제약을 단단히 지켜준다는 점이 중요.

             ex) char greeting[] = Hello";

                  char *p = greeting;                           // 비상수 포인터, 비상수 데이터

                  const char *p = greeting;                  // 비상수 포인터, 상수 데이터

                  char * const p = greeting;                 // 상수 포인터, 비상수 데이터

                  const char * const p = greeting;        // 상수 포인터, 상수 데이터

            매개 변수 혹은 지역 객체를 수정할 수 없게 하는 것이 목적이라면 const를 사용하자.

            상수 멤버 함수 - (1) 클래스의 인터페이스를 이해하기 좋게 하기 위함.

                                    (2) const 키워드를 통해 상수 객체를 사용할 수 있게 하기 위함.

                 비트수준 상수성 - 멤버 함수가 그 객체의 어떠한 데이터도 변경시키지 않음. 멤버 함수 자체가 const

                 논리적 상수성 - 상수 멤버 함수라고 해도 객체에 약간의 변경은 가할 수 있고, 그것을 사용자 측에서 알아채지 못하게만 함.

                                        (상수 멤버 함수에서 변경될 데이터에 mutable 키워드를 붙여 가능)

  항목 4. 객체를 사용하기 전에 반드시 그 객체를 초기화 하자.

             생성자 초기화

             상수와 참조자인 데이터 멤버는 반드시 초기화가 되어야 함.

             (1) 기본 클래스는 파생 클래스보다 먼저 초기화 되고, (2) 클래스 데이터 멤버는 그들이 선언된 순서대로 초기화 됨.

             * 서로 다른 번역 단위에 정의된 비지역 정적 객체들 사이의 상대적인 초기화 순서는 정해져 있지 않음.

                  

           


'20130827이전 > EC++' 카테고리의 다른 글

항목 22 - 25  (0) 2012.12.22
항목 18 - 21  (0) 2012.12.21
항목 13 - 17  (1) 2012.12.21
항목 9 - 12  (0) 2012.12.21
항목 5 - 8  (0) 2012.12.18
항목 1 - 4  (0) 2012.12.18
Posted by 흰둥에미

최근에 달린 댓글

최근에 받은 트랙백

글 보관함