프로그래밍/Effective C++(35)
-
인라인함수 따져보기(effective c++ 30)
인라인 함수장점함수처럼 보이고 함수처럼 동작하는데다가 훨씬 안전하고 쓰기 좋다.함수 호출 시 발생하는 오버헤드도 걱정할 필요가 없다. 숨겨진 이점함수 호출 비용이 면제되는 것은 눈에 보이는 부분에 불과하다. 인라인 함수를 사용하면 컴파일러가 함수 본문에 대해 문맥별(context-specifc) 최적화를 걸기가 용이해진다. 단점인라인 함수로 인해 부풀려진 코드는 성능의 걸림돌이 되기 쉽다.페이징 횟수가 늘어나고 명령어 캐시 적중률이 떨어질 가능성도 높아진다. 컴파일러잘 알다시피 인라인 키워드를 붙인다 하더라도 컴파일러가 판단하여 인라인을 하여 성능이 좋아진다면 인라인할 것이고 그게 아니라면 인라인을 하지 않는다. 생성자/소멸자생성자와 소멸자는 인라인하기에 그리 좋지 않은 함수이다.생성자와 소멸자는 내부에..
2015.09.04 -
예외 안정성 확보(effective C++ 29)
예외 안정성요구사항- 자원이 새도록 만들지 않는다.(함수 내부에서 동적할당한 후 해제하지 않고 탈출하는 경우)- 자료구조가 더럽혀지는 것을 허용하지 않는다.(정상적인 동작을 예상하고 카운트 등을 증가시켰는데, 예상치 못한 예외에 의해 함수에서 탈출해버리는 경우) 보장성예외 안전성을 가진 함수는 아래의 세 가지 보장(Guarantee) 중 하나를 제공한다.- 기본적인 보장(Basic Guarantee) : 함수 동작 중 예외가 발생하면, 실행 중인 프로그램에 관련된 모든 것들을 유효한 상태로 유지한다. - 강력한 보장(Strong Guarantee) : 프로그램의 상태를 절대로 변경하지 않는다는 보장. 호출이 실패하면 호출 자체를 없었던 것처럼 하여 프로그램의 상태가 되돌아간다.- 예외불가 보장(Nothr..
2015.09.04 -
내부에서 사용하는 객체의 핸들을 반환하는 코드는 NO(effective c++ 28)
핸들이란?핸들은 구체적인 어떤 대상을 접근하기 위한 용도로 쓰이는 매개체이다.핸들로서 레퍼런스 변수와 포인터 변수, 반복자가 여기에 해당한다. 핸들 반환핸들을 반환한다는 것은 메모리에 접근하여 데이터를 수정할 수 있게 한다는 것이다.그 때문에 객체의 캡슐화는 무너진다.const를 사용하여 어느 정도 보완할 수 있다. 그렇지만 무효 참조 핸들(Dangling handle)이 발생 할 수 있다. 무효 참조 핸들핸들이 있기는 하지만 그 핸들을 따라갔을 때 실제 객체의 데이터가 없는 것을 의미한다.핸들을 반환하게 되면 자주 발생하는 현상이다. 예시문제마지막 문장 끝날 즈음에는 boundingBox()함수에서 생긴 임시 객체가 사라지면서 소멸자를 호출 할 것이다.아마도 정상인이라면 이 객체 내부에 동적할당을 한 ..
2015.09.04 -
캐스팅 절약(effective c++ 27)
C++의 캐스팅이란?어떤 일이 있어도 타입 에러가 생기지 않도록 보장한다.이론적으로 C++ 프로그램은 컴파일만 끝나면 그 이후엔 어떤 객체에 대해서도 불안전한 연산이나말도 안되는 연산을 수행하려 들지 않는다. 문제점캐스트( cast )는 C++의 동작 규칙을 무시 할만한 기능을 갖고 있다.C++에서 캐스팅은 정말로 조심해서 써야 하는 기능이다. C++ 스타일 캐스트const_cast객체의 상수성( constness )을 없애는 용도로 사용된다. 이런 기능을 가진 C++ 스타일의 캐스트는 이것 밖에 없다.객체의 휘발성( volatileness )을 제거하는 용도로도 쓰인다. dynamic_cast'안전한 다운 캐스팅( safe downcasting )'을 할 때 사용하는 연산자이다.주어진 객체가 어떤 클래..
2015.09.04 -
변수 정의 최대한 늦추기(effective c++ 26)
왜?사용하지 않을 상황에 객체를 생성하여 필요 없는 생성자랑 소멸자를 호출하는 상황을 피할 수 있다.객체생성에 필요한 모든 값을 받은 뒤 생성자에서 값을 초기화하여 필요 없는 대입을 막는다 예외가 발생하면 encrypted변수는 사용되지 않고 쓸데없는 생성자와 소멸자만 호출하고 사라짐. 방법. 객체를 예외 이후에, 대입 연산이 일어난다면 그냥 복사생성자로! 루프에서 A방법 : 생성자 1번 + 소멸자 1번 + 대입 n번B방법 : 생성자 n번 + 소멸자 n번 대입에 들어가는 비용이 생성자 + 소멸자보다 적게 나온다면 A방법을 사용.단 A방법은 w의 범위가 넓어지므로 유지보수에는 불리. 그 외에는 B방법을 사용한다. 정리변수 정의는 늦출 수 있을 때까지 늦추는 것이 프로그램이 깔끔해지며 효율이 좋아진다.
2015.08.25 -
예외를 던지지않는 swap(effective c++ 25)
표준 제공 swap복사만 제대로 지원하는 타입이면 어떤 타입의 객체이든 맞바꾸기 동작을 수행한다. 성능swap의 내부에 객체를 넘기면 얄짤 없이 복사가 세 번이 일어난다. (엄청난 비효율) pimpl기법pointer to implementation이란 뜻으로 객체가 실제 데이터를 모두 가지고 있는 것이 아니라 이를 가리키는 포인터로 설계하는 기법. 비효율적 swap 호출 한번 복사에 복사 생성자와 대입연산자가 여러 번 호출한다. 특히 pImpl 기법이 사용되었다면 극도로 비효율적인 작업이 된다. 특수화 템플릿 swap 클래스의 swap으로 데이터가 가리키는 포인터만 서로 교환한다.Wiget2의 완전 특수화 템플릿을 구성해주어 해당 클래스가 호출 될 때 이 특수화 함수가 호출 되도록 한다. 클래스 템플릿 ..
2015.08.25