방프리
25.03.04 최신 C++ 개념 3일차 (포인터 Const / 이동 의미론) 본문
1. 포인터에 대한 const 전파
- const 정확성에서 가장 실수가 많은 것은 const로 초기화된 객체가 멤버 포인터가 가리키는 값을 변경하는 것
namespace exp = std::experimetal;
class Foo
{
public:
auto set_ptr(int* p) const
{
ptr_ = p; // not compiled
}
auto set_val(int v) const
{
val_ = v; // not compiled
}
auto set_ptr_val(int v) const
{
*ptr_ = v; // not compiled
}
private:
exp::propagate_const<int*> ptr_ = nullptr;
int val_{};
};
2. 이동 의미론의 객체 복사 생성
- 객체를 복사할 때 새로운 자원이 할당되어야 하며, 원본 객체에서의 자원이 복사돼 두 개의 객체가 완전히 구분되어야 함
- 자원의 할당과 복사는 느리고, 대부분의 경우 원본 객체는 더 이상 필요하지 않음
3. 자원의 획득과 3의 법칙
- C++에서 클래스와 자원 획득의 기본 개념 중 하나는 클래스가 반드시 자신의 자원을 완벽히 관리해야 함
- 예로 클래스가 복사, 할당, 소멸될 때 클래스 내부의 자원도 복사, 할당, 해제를 반드시 해야 함
- 위의 규칙을 3의 법칙이라고 한다. (복사 생성자, 복사 할당 소멸자, 소멸자)
4. 3의 법칙에 대한 제약
- std::thread 클래스, 네트워크 연결 등과 같은 복사할 수 없는 자원
- 함수에서 Buffer 클래스를 반환하는 경우와 같은 상황에서는 3의 법칙이 제한받는다.
5. 이동 의미론 없는 복사 방지
- 이동 의미론을 사용하지 않을 경우 스마트 포인터로 대체
- 원시 포인터로도 대체가 가능하지만 이 경우 퍼포먼스 저하를 일으킬 수 있다.
6. 이동 의미론 소개
- 이동 생성자와 이동 할당이 추가되면서 3의 법칙이 5의 법칙으로 변경
- && 수식어는 파라미터가 복사보다 이동을 원하는 객체임을 뜻함 (이론적 용어로 오른쪽 값이라고 지칭)
- 이동 생성자와 이동 할장 작업자에 noexcept 표기를 잊어서는 안된다.
'C++ > 고성능을 위한 언어 C++' 카테고리의 다른 글
25.02.23 최신 C++ 개념 2일차 (std::function 개념론) (0) | 2025.02.23 |
---|---|
25.02.10 최신 C++ 개념 1일차 (0) | 2025.02.10 |
Comments