2020 이전/C++

이펙티브 C++ Chapter 5 구현

이상해C++ 2018. 11. 12. 20:05


요약


26. 변수를 너무 앞서서 정의하면 수행성능이 갑자기 떨어진다. 쓰지도 않을 클래스를 불렀을 때, 

27. 캐스팅 남용하면 느리고, 손보기도 힘들다. 미묘한 버그에 치명타가 발생할 수 있다.

28. 객체 내부 private 멤버의 참조자를 반환하는 public 함수는 캡슐화가 깨고 유효하지 않는 핸들(dangling handle)이 남용할 수 있게 한다.

29. 예외발생시 적합한 처리를 하지 않으면, 자원이 누출되고 자료구조가 망가진다.

30. 인라인 남용은 비대한 코드를 불러온다.

31. 코드의 결합도가 높으면 빌드시간이 길어진다. 



26. 변수정의는 늦출 수 있는 곳까지 늦춘다.

생성자/소멸자를 호출하는 type(class)로 변수를 정의할때 문제점은 (1) 프로그램 제어 흐름이 변수 정의에 닿을때의 생성자 호출 비용과 (2) 변수가 유효범위에서 벗어날때의 소멸자 호출비용이 생긴다는 점이다.


ex) 비밀번호가 길 경우 해당 비밀번호를 암호화하는 함수

string encrypted(string &password)
{
     string encrypted;
     enctrypted = password;
     if(패스워드가 짧으면 error 반환)
     return encrypted;
}

string encrypted
{
     if(패스워드가 짧으면 error반환)
     string encrypted;
     enctrypted = password;
     return encrypted;
}

후자의 코드는 에러에 걸리면 string encrypted 기본생성자도 복사대입연산자도 호출하지 않게 된다.

ex) Loop

루프 바깥에 정의 : 생성자 1, 소멸자 1, 대입 N

루프 안쪽에 정의 : 생성자 N, 소멸자 N

만약 대입비용이 생성자-소멸자 쌍의 호출 비용보다 더 크다면 루프 바깥쪽에 정의한 비용이 더 크게 된다.


27. 캐스팅은 절약, 또 절약!

C-style의 캐스팅

(T) 표현식

T (표현식)


C++style의 캐스팅

1. const_cast<T>(표현식)

2. dynamic_cast<T>(표현식)

3. reinterpret_cast<T>(표현식)

4. static_cast<T>(표현식)


1. 객체의 상수성을 없앤다 : 이상하고 특이한 친구다

2. safe down-casting : 런타임 비용이 크다

3. ex) 포인터 -> int : 하부 수준의 캐스팅

4. static_cast : 비상수->상수 / int -> double같은 암시적 변환을 강제로 진행할 때 쓰인다. 


구형스타일 캐스트를 쓸 수 도 있지만 C++ style 캐스트를 쓰는 이유

1. 코드를 읽을 때 알아보기 쉽다.

2. 캐스트를 사용한 목적을 세분화 하기때문에 compiler에서 사용에러를 진단할 수 있다.


객체를 인자로 받는 함수에 명시호출생성자를 호출하고 싶을 때







'2020 이전 > C++' 카테고리의 다른 글

C++ std::function 콜백  (0) 2019.02.06
C++ auto  (0) 2018.11.28
이펙티브 C++ 챕터 4 설계 및 선언  (0) 2018.10.31
이펙티브 C++ 챕터3 자원관리 (1회차)  (0) 2018.10.29
이펙티브 C++  (0) 2018.10.28