2014-11-20 6 views
1

컨테이너가 연속적이며 동시에 이동 의미를 지원할 수있는 방법은 무엇입니까? 연속적인 저장소 컨테이너와 이동 의미 체계

표준 : : 벡터 예

:와 push_back()가 좌변에 표준 : : 이동을 사용하여 호출됩니다 :

std::vector<MyClass> v; 

MyClass obj; 
MyClass obj2; 

vt.push_back(std::move(obj)); 
vt.push_back(std::move(obj2)); 

OBJ 반드시 메모리에 서로 옆에 obj2보다 할당되지 않습니다. 이제 벡터가 연속적인 메모리에 요소를 가져야하므로이 경우 의미를 이동시키는 방법은 무엇입니까? 그것은 obj2를 벡터 v의 인접한 메모리 영역 (obj 옆)에 복사해야만한다. 그렇지 않으면 인접성 요구 사항이 충족되지 않을 것이다. 그러나 그것은 복사본이 아니라 움직이기를 요구합니다. 위의이 다음

MyClass obj; 
MyClass obj2; 

vt.push_back(std::move(obj)); 
vt.push_back(obj2); 

답변

2

당신은 단지

이동 :-) 이동 의미에 대해 조금 더 읽을 필요가? 물체가의 주소를 변경하지 않습니다 사이의 차이점은 무엇입니까 개체 자체. 의 이동 생성자 (또는 컨텍스트에 따라 할당 연산자 등)를 호출하면 이동하려는 객체가 전달 된 객체의 다른 인스턴스가 호출됩니다.

이 예에서 벡터는 push_back에 하나씩 두 개의 MyClass 개체를 내부 저장소에 만듭니다. 그러나 첫 번째 경우 복사 생성자를 호출하고 obj을 통해 (MyClass const&을 통해) 전달 이동 생성자를 호출하고 참조 값 (MyClass&&)을 obj으로 전달합니다. 그런 다음 obj 객체의 내용을 벡터 내부의 내용으로 옮기는 것은 해당 생성자의 몫입니다. 이 '이동'객체로의 의미 (이동

말하면

자체 있다는 벡터에서 생성되는 객체 및 그들의 내용 그러므로 그것은의 각 유형에 대해 잠재적으로 다른 실제 이동을하기 위해 생성자의 작업 이동).

std::move도 이동 생성자를 호출하지 않을 수 있습니다. 예를 들어 하나도 없을 수도 있고 noexcept이 아닌 수도 있습니다 (이 경우 std::vector은 전혀 사용할 수 없습니다). 예외적 인 안전 보장을 위반하지 않은 상황).

0

std::move은 캐스트이며, 무조건적인 캐스트이며 적절한 의미 체계를 사용하지 않으면 사본에서 쉽게 부패 할 수 있습니다.

즉, std::move을 작성했다고해서 의미가 이동한다는 것을 보장하지 않는 T&& 유형 이외의 다른 것을 보장 할 수는 없습니다.