값 형식 (C++ 현대)

C + + 클래스 기본 값으로 형식입니다.이 항목에서는 소개 개요 값 형식 및 용도에 관련 된 문제를 제공 합니다.

VS 값. 참조 형식

이전에 언급, c + + 클래스는 기본 값으로 형식입니다.개체 지향 프로그래밍 다형 동작을 지 원하는 데 사용 되는 참조 형식으로 지정할 수 없습니다.때로는 값 형식과 참조 형식의 기본 클래스 및 가상 함수 다형성 목적 반면 제어, 메모리 및 레이아웃의 관점에서를 볼 수 있습니다.기본적으로 값 형식은는 항상 복사 생성자와 복사 대입 연산자를 복사할 수 있습니다.참조 형식에 대해 클래스 복사할 수 비 변경 (복사 생성자 나 복사 할당 연산자로 사용 안 함) 및 의도 다형성을 지원 가상 소멸자를 사용 합니다.값 형식을 복사 하는 경우는 개별적으로 수정할 수 있는 두 개의 독립 변수 값을 제공 하는 항상 내용에 대 한 이기도 합니다.참조 유형은 개체의 종류를 id –?이런이 이유로, "참조 형식" "으로 다형 형식" 라고도 합니다.

같은 참조 형식 (기본 클래스, 가상 함수)를 진정으로 원하는 경우 복사를 명시적으로 사용 하지 않도록 설정 하려면 같이 해야는 MyRefType 클래스에 다음 코드를.

// cl /EHsc /nologo /W4

class MyRefType {
private:
    MyRefType & operator=(const MyRefType &);
    MyRefType(const MyRefType &);
public:
    MyRefType () {}
};

int main()
{
    MyRefType Data1, Data2;
    // ...
    Data1 = Data2;
}

위의 코드를 컴파일하고 다음 오류가 발생 합니다.

  
  
  

값 형식 및 이동 효율성

복사 할당 오버 헤드가 인해 새로운 복사 최적화를 피할 수 있습니다.예를 들어, 문자열 문자열 벡터를 중간에 삽입 하면 있을 없음 복사 재할당 부담만을 이동-에 벡터의 grow 되더라도.이 예를 들어 두 개의 대형 개체에서 추가 작업을 수행 하는 다른 작업에도 적용 됩니다.이러한 값 작업 최적화를 사용 하려면 어떻게?컴파일러에서 복사 생성자 자동 생성할 수 있습니다 것 처럼 일부 c + + 컴파일러에서 컴파일러가에 대 한 암시적으로 있습니다.그러나 Visual C++ 클래스를 "클래스 정의에서 선언 하 여 할당 하 고 생성자를 옮기려면 옵트인" 해야 합니다.이중 앰퍼샌드를 사용 하 여 수행 됩니다 (& &) rvalue 참조에서 적절 한 멤버 함수 선언 및 정의 이동 생성자와 할당 메서드를 이동 합니다.도용"의 guts는 소스 객체를" 올바른 코드를 삽입 해야 합니다.

어떻게 활성화 이동 해야 하는 경우를 결정 하지?알고 건설 활성화를 복사 해야 하는 경우에 전체 복사본 보다 저렴 될 수 있으면 사용 가능한 이동 할 것입니다.그러나 지원 이동 해야 알고 있으면이 반드시 원하는 복사본 활성화 아닙니다.이 후자의 경우 "이동 전용 형식" 호출할 수 있습니다.표준 라이브러리에는 unique_ptr.보조 노트, 이전으로 auto_ptr 사용 되지 않습니다 및 교체 된 unique_ptr 정확 하 게 부족 하 여 c + +의 이전 버전에서 이동 기능 지원.

이동 기능을 사용 하 여 반환 값 이나 중간에 삽입의 수. 있습니다이동 최적화의 복사본입니다.힙 할당 문제 해결에 대 한 필요성이입니다.다음 의사 코드를 살펴보겠습니다.

#include <set>
#include <vector>
#include <string>
using namespace std;

//...
set<widget> LoadHugeData() {
    set<widget> ret;
    // ... load data from disk and populate ret
    return ret;
}
//...
widgets = LoadHugeData();   // efficient, no deep copy

vector<string> v = IfIHadAMillionStrings();
v.insert( begin(v)+v.size()/2, "scott" );   // efficient, no deep copy-shuffle
v.insert( begin(v)+v.size()/2, "Andrei" );  // (just 1M ptr/len assignments)
//...
HugeMatrix operator+(const HugeMatrix& , const HugeMatrix& );
HugeMatrix operator+(const HugeMatrix& ,       HugeMatrix&&);
HugeMatrix operator+(      HugeMatrix&&, const HugeMatrix& );
HugeMatrix operator+(      HugeMatrix&&,       HugeMatrix&&);
//...
hm5 = hm1+hm2+hm3+hm4+hm5;   // efficient, no extra copies

Hh438479.collapse_all(ko-kr,VS.110).gif이동에 대 한 적절 한 값 형식 사용합니다.

이동 전체 복사본 보다 저렴 수 있습니다 같은 값 클래스에 대해 이동을 생성 하 고 배정 효율성에 대 한 이동 합니다.다음 의사 코드를 살펴보겠습니다.

#include <memory>
#include <stdexcept>
using namespace std;
// ...
class my_class {
    unique_ptr<BigHugeData> data;
public:
    my_class( my_class&& other )   // move construction
        : data( move( other.data ) ) { }
    my_class& operator=( my_class&& other )   // move assignment
    { data = move( other.data ); return *this; }
    // ...
    void method() {   // check (if appropriate)
        if( !data ) 
            throw std::runtime_error("RUNTIME ERROR: Insufficient resources!");
    }
};

또한 복사 생성/할당을 사용 하면 전체 복사본 보다 저렴 수 있는 경우 이동 생성/할당 있습니다.

일부 값이 아닌 형식인 이동만 소유권 리소스를 복제할 수 없을 때 같은 전용.예를 들어, unique_ptr 같은 형식입니다.

단원

콘텐츠

참고 항목

개념

C + + 형식 시스템 (현대 C++)

기타 리소스

C + + (현대 C++)를 다시 시작

C + + 언어 참조

표준 C++ 라이브러리 참조