개발/C++
-
shared_ptr 사용할 때 주의 사항개발/C++ 2022. 1. 9. 14:22
cpprerefence 문서를 보면 구현에 관한 가이드 중에서 다음과 같은 부분이 있습니다. The destructor of shared_ptr decrements the number of shared owners of the control block. If that counter reaches zero, the control block calls the destructor of the managed object. The control block does not deallocate itself until the std::weak_ptr counter reaches zero as well. shapred_ptr의 소멸자는 컨트롤 블록을 공유하는 소유자 수를 감소시킵니다. 만약 카운터가 0에 도달하면 컨트롤..
-
전달 참조(보편 참조)개발/C++ 2022. 1. 8. 23:00
값의 카테고리는 기본적으로 lvalue, xvalue, prvalue 나눌 수 있습니다. prvalue 옛날의 rvalue입니다. 쉽게 말해 1과 상수, 42, true, nullptr 같은 리터럴(문자열 리터럴은 제외)입니다. 함수의 반환값이나 a + b처럼 오른쪽에만 올 수 있는 값입니다. xvalue eXpiring value로서 prvalue는 아니지만 prvalue처럼 기한이 있는 값입니다. 대표적으로 std::move(x)입니다. lvalue 나머지가 lvalue입니다. 변수 이름, 데이터 멤버, 심지어 타입이 rvalue reference라면, 이름으로 되어 있는 표현식은 lvalue입니다. 예를 들어 T&& a = T()일 때 a는 lvalue입니다. prvalue와 xvalue를 묶어 r..
-
RVO, NRVO개발/C++ 2022. 1. 8. 17:10
NRVO는 프로젝트 속성 페이지의 C/C++의 최적화 탭에서 최적화 항목을 최적화라고 선택해야 동작합니다. 속도 우선이나 크기 우선 옵션으로 해도 됩니다. 최적화 옵션을 키고 나서 RTC1 옵션과 충돌을 일으킨다는 메시지가 뜨면 C/C++의 코드 생성 탭에서 기본 런타임 검사 옵션을 기본값으로 설정합니다. NRVO가 동작하면 다음 코드는 객체 복사를 수행하지 않습니다. #include using namespace std; class Test { public: Test() : _num(0) { cout
-
noexcept개발/C++ 2022. 1. 6. 20:36
함수는 대부분 noexcept(false)입니다. 절대 예외를 던지지 않는다면 noexcept 키워드를 통해서 설정할 수 있습니다. 함수가 절대 예외를 던지지 않는 경우 동작 중 실패하지 않으므로 실패했을 때의 값을 복원할 필요가 없기 때문에 스택을 준비하지 않아도 됩니다. run stack에서 unwindable state를 유지할 필요가 없습니다. vector의 크기가 capacity와 같아진다면 저장 공간을 동적으로 추가 확보하며 기존 데이터를 새로운 저장 공간으로 옮깁니다. 이동 생성자가 정의되어 있는 경우 데이터를 이동하고 그렇지 않은 경우 복사 생성자를 통해 복사합니다. 이동 생성자는 만약 예외가 일어날 경우 원래 값으로 복구할 수가 없기 때문에(std::move 함수를 통해 rvalue로 만..
-
get 함수를 const로 해야 하는 이유개발/C++ 2022. 1. 4. 22:16
객체를 만약 const로 선언한다면 초기화 이후에 내부 데이터를 변경하지 않겠다는 의미입니다. 데이터는 변경할 수 없어도 외부에서 값이 필요할 수는 있습니다. 하지만 get 함수에 const를 붙이지 않는다면 const 객체는 get 함수를 호출할 수 없습니다. 함수를 호출할 때 암시적으로 this 포인터가 전달되므로 const 객체는 const this가 전달됩니다. 이 때 함수가 const가 아니라면 const 포인터는 일반 포인터가 가리킬 수 없기 때문에 함수를 호출할 수가 없는 상황이 됩니다. 다음 그림을 보면 선언되어 있는 getName 함수에 접근하지 못함을 알 수 있습니다. 상수 객체를 생성해야 하는 이유가 있을 텐데 get 함수를 호출하지 못해 상수 객체를 만들지 못하는 상황은 없어야 할 ..