C++ constexpr
·
C++
컴파일 시 값 평가를 강제하기 위하여 탬플릿 메타프로그래밍 남용 -> 보통 컴파일러가 자발적으로 평가해주지만 어떤 코드로 인하여 컴파일러가 해주지 않는 경우가 있다. => constexpr는 이를 해달라는 프로그래머의 의도를 보여주는 방식이다.(비슷한 예시로 inline이 있다) 컴파일 도중 "반드시" 값이 결정되게 하려면 constexpr변수를 쓸 것 문자열 해쉬를 도중에 만들 수 있다면? -> 문자열 비교에 드는 런타임 비용은 언제나 O(1)이 된다. -> constexpr을 써서 컴파일 타임에 문자열 해쉬를 만들 수 있게 됐다! 참고로 const와 constexpr은 다르다. 변수의 경우 const => 변경을 불허 constexpr => 컴파일 시 평가를 해달라 하지만 둘 다 const다 즉 co..
이동 생성자 및 이동 대입 연산자
·
C++
값의 분류(대표적) 1. lvalue 지속적으로 유지되는 개체 2. rvalue lvalue가 아닌값, 일시적인 값 ex) 람다 rvalue 참조 (&&) - 임시적인 값을 참조로 쓰겠다. - C++11이후 나옴 - 기능상 &연산자와 비슷 - & 연산자 -> lvalue 참조, &&연산자 -> rvalue 참조 std::move() - rvalue 참조로 반환 - lvalue를 rvalue로 변환 이동 생성자 ::(&&) - 다른 개체 멤버 변수들의 소유권을 가져 옴 - 복사 생성자와 달리, 메모리 재할당 x - 복사 생성자보다 빠름 - 약간 얕은 복사와 비슷하다. -> Mystring::MyString(MyString&& other) {...} rvalue 최적화 - 이동 생성자와 이동 대입 연산자 =..
C++ 스마트 포인터
·
C++
포인터를 사용했으면 바로 delete를 사용해라 스마트 포인터 -> delete를 직접 호출할 필요가 없다. 가비지 컬렉터보다 빠르다 1. unique_ptr (많이 사용) 포인터(원시)를 단독으로 소유 원시 포인터는 누구하고도 공유하지 않음. -> 복사나 대입 불가 unique_ptr가 범위를 벗어날 때 원시 포인터는 지워짐(delete) unique포인터를 사용하기 적합한 경우 1) 클래스에서 생성자/소멸자 -> 앞으로 소멸자 사용X 2) 지역 변수 선언할 때 3) STL 벡터에 포인터 저장할 때 C+11에서는 포인터를 하나 만든 후 unique포인터 2개에 각각 대입을 하고 하나를 delete하면 모든 정보가 날라가고 남은 1개의 unique포인터를 delete하면 이미 지워진 데이터를 지우려고한다..
C++ STL
·
C++
새로 추가된 STL 1. std::unordered_map (그리고 unordered_multimap) - 정렬안된 맵 std::map은 자동으로 정렬되는 컨테이너다. -> 요소 삽입/제거가 빈번하면 성능이 저하된다.=>정렬안된 std::unordered_map사용 std::unordered_map은 키와 값의 쌍들을 저장, 키는 중복 불가, 자동으로 정렬되지않음 -> 요소는 해쉬 함수가 생성하는 색인 기반의 버킷들로 구성, 해쉬맵이라고도 함. std::map 자동 정렬, 이진 탐색 트리, 탐색 시간 : O(logn), 삽입과 제거가 빈번하면 느리다. std:: unordered_map 자동 정렬X, 해쉬 테이블, 탐색 시간 O(1)-해쉬 충돌 없는 경우, 최악 : O(n), 버킷 때문에 메모리 사용량 ..
C++ 새로운 자료형
·
C++
C언어 NULL int number = NULL; (O) int* ptr = NULL; (O) nullptr //NULL 인데 포인터로 지정 int anotherNumber = nullptr; (Error) int* anotherPtr = nullptr; (O) 포인터에는 언제나 nullptr을 사용하자. 더 이상 NULL이 있을 곳은 없다. 고정 폭 정수형 기존 기본 자료형은 몇 바이트로 만들어라 라는 표준이 없다. int는 4byte라고 알려져있지만 모두 그런 것은 아님. 대표적으로 long은 C#에서 8byte C++에서는 4byte임 이렇게 컴파일러마다 다른 자료형 크기를 고정하기위하여 만듦 int8_t / uint8_t int16_t / uint 16_t intptr_t / uintptr_t 등..
C++ 11/14/17/...의 키워드
·
C++
1. auto : 데이터 형을 자동으로 추론 - 컴파일 동안 데이터 형이 결정이 된다. - 따라서, 반드시 auto 변수를 초기화해야한다. - Javascript의 동적으로 자료형이 바뀌는 것과는 다르다. 포인터 받을 때 : auto 또는 auto* (확실히 구분하는 것이 좋다. 모호한 상황에서 가독성이 좋지 않기 때문) 참조를 받을 때 : auto& (&가 없으면 컴파일러가 구분을 못하기 때문에 당연하게 &를 붙여야 한다) const 참조를 받을 때는 const auto&를 사용하자(이 것도 가독성이 안좋아진다.) auto는 타이핑을 줄여주는 대신 가독성을 떨어트린다. => 몇 개를 제외하고 auto보다 실제 자료형을 선호한다. auto를 사용하는 경우 for (std::vector::const_ite..