분류 전체보기(603)
-
size() == 0? empty()!! (effective STL 04)
empty()는 인라인함수! (상수시간)list의 size()는 선형 시간에 수행되는 경우가 꽤 많다. list에서 왜 문제가 되는가?size() vs splice()- splice()는 리스트를 중간에 잘라 붙이는 함수이다.- size()와 splice()는 하나는 상수 시간, 다른 하나는 선형 시간일 수 밖에 없다.- splice()가 잘려서 넘어갈 때 이것을 셀 것인가? 에 대해 작성 방식에 따라 다르다.- splice()를 세어 총 크기에 더해주면 splice()는 선형, size()는 상수- splice()를 세지 않고 붙여주면 splice()는 상수, size()는 선형
2015.08.25 -
복사는 컨테이너 안의 객체에 맞게 비용 최소화, 동작은 정확히(effective STL 03)
STL의 방식copy in, copy out!컨테이너에서 넣거나 뺄 때 복사. 복사가 왜?STL에서 복사는 거의 모든 순간에 일어난다.- 큰 객체를 컨테이너에 넣을 때에 단순히 객체를 컨테이너에 넣으면수행 성능의 병목현상을 일으킨다는 것.- 상속된 객체의 경우 복사 동작 중에 데이터가 잘리기도 한다.(복사 손실) 포인터를 넣으면?포인터만 복사하므로 뒤의 문제가 생기지 않는다.하지만.. 이것도 STL의 골칫거리다.(뒤의 장에서 자세히 다루지만 대충 remove 계열 함수에서 메모리 누수나 다른쪽을 가리키는 현상 등등)해결은 스마트 포인터가 괜찮은 방법 배열 vs 백터STL은 일반적으로 "불필요한"복사를 피하도록 설계되어있다.12Widget w[size];vector ww;cs line1은 size개의 Wi..
2015.08.25 -
컨테이너 독립적인코드라는 환상 조심!(effective STL 02)
STL은 일반화(generalization)에 기초를 두고 만든 프로그래밍 장치.데이터 집합 - 컨테이터(데이터의 타입은 매개 변수화) 일반화함수 - 알고리즘(반복자의 타입은 매개 변수화) 일반화포인터 - 반복자(포인터가 가리키는 객체의 타입은 매개 변수화) 일반화 컨테이너 타입은 시퀀스와 연관 컨테이너로 일반화.표준 연속 메모리 컨테이너 - 임의 접근 반복자를 쓸 수 있다.노드 기반 컨테이너 - push_back, push_front 지원.연관 컨테이너 - 로그 시간 복잡도를 가진 lower_bound, upper_bound, equal_range 지원. 반복자, 포인터, 참조자를 무효화시키는 방식이 컨테이너마다 다르다.독립적인 코드라고 좋은 것이 아니다. STL 컨테이너는 각자 자신만의 장점과 약점을..
2015.08.25 -
변수 정의 최대한 늦추기(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 -
타입변환이 모든 매개변수에 적용된다면? 그 함수는 비멤버로(effective c++ 24)
예시- 어떤 함수에 들어가는 모든 매개변수(this 포인터가 가리키는 객체도 포함해서)에 대해 타입 변환을 해 줄 필요가 있다면, 그 함수는 비 멤버 함수여야 한다.- 암시적 타입 변환에 대해 매개변수가 적용되려면 매개변수 리스트에 들어있어야 한다는 것.(말이 너무 어렵다!!!!) 해결 보통 프렌드로 비맴버 함수로 구현했었는데. 변환생성자에 explicit를 안쓰면 뭔가 깨림찍..
2015.08.25