요약
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 |