방프리

25.03.04 최신 C++ 개념 3일차 (포인터 Const / 이동 의미론) 본문

C++/고성능을 위한 언어 C++

25.03.04 최신 C++ 개념 3일차 (포인터 Const / 이동 의미론)

방프리 2025. 3. 4. 21:48

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 표기를 잊어서는 안된다.