2016-06-21 5 views
2

이동 생성자/이동 할당 내에서 값을 명시 적으로 이동해야하는지 여부를 알고 싶습니다. 나는 다음과 같은 상황이 있다고 가정하자 : 모든더 이상 사용하지 않는 값을 이동해야합니까?

struct Node 
{ 
    std::vector<int> items; 
}; 

Node create() 
{ 
    std::vector<int> items; 
    items.push_back(2); 

    Node n; 
    // should I use n.items = std::move(items); 
    // instead? 
    n.items = items; 

    // other code, not using items any more 

    return n; 
} 

우선, 내가 다음 코드에서 더 이상 이동 된 값을 사용하지 않는 것이 제공 std::move를 사용하여 좌변을 이동 맞습니까?

둘째, 명시 적으로 값을 이동하는 것이 더 빠르습니까? 아니면 컴파일러가 자동으로 그 값을 이동시킬 수 있는지 감지합니까?

+0

이동이 복사본보다 낫다 – vu1p3n0x

+3

'n'을 먼저 인스턴스화하고'n.items'를 직접 누르는 것이 왜 문제가되지 않습니까? – user4581301

+0

@ user4581301이 맞습니다. 당신은 비범 한 예를 생각해 낼 수 있습니까? –

답변

0

lvalue가 더 이상 유효하지 않을 수 있음을 기억하는 한 lvalue를 움직이는 것이 좋습니다. 그 위에 무언가를 복사 할 수 있지만 다시 한번 괜찮을 것입니다.

벡터의 내용을 이동하는 것은 벡터의 각 요소를 개별적으로 복사하는 것이 아니라 기본 포인터 (및 크기 변수)를 바꾸기 만하면되므로 일반적으로 복사하는 것보다 빠릅니다. int처럼 단순한 것을 움직이는 것은 어리 석다.

마지막으로, 귀하의 예에서는 분명히 분명하지 않을 것입니다. items은 lvalue이므로 컴파일러가 항목을 전혀 사용하지 않는다는 것을 알기가 어렵지 않으면 명시 적으로 도움이 될 수 있도록 복사 의미를 사용합니다.

+0

글쎄, 시나리오에 벡터가 포함되어 있습니다 * more * 하나의 항목보다, 예제는 실제로 설명하는 것입니다 :) – hfhc2

1

당신은 이동을 방지하고 컴파일러의 대상 및 최적화의 초기화에 남아있을 수 있습니다 :

struct Node 
{ 
    std::vector<int> items; 
}; 

Node create() 
{ 
    std::vector<int> items; 
    // ... 
    return Node{items}; 
} 

일반적인 조언은 다음과 같습니다 overhasty 수동 최적화를 적용하지 마십시오.

관련 문제