2017-09-12 11 views
3

Copy 특성을 구현하여 move-semantics 대신 copy-semantics 유형을 제공 할 수 있습니다. 모든 구성 요소 (제품 유형의 각 요소 또는 합계 유형의 각 변형의 각 요소)도 Copy 인 경우에만 수행 할 수 있습니다.가능한 경우 Copy 특성을 항상 구현해야합니까?

이렇게하면 다소 큰 유형 Copy을 만들 수 있습니다. 유형의 크기가 "큰"경우 Copy을 구현하면 성능에 해가 될 수 있습니까?

Copy은 항상 구현해야하는 경우, 왜 그것을하지를 구현하고 옵트 아웃 의미 대신에 선택 하에서의있을 수 있습니다 그 유형 SyncSend 같은 자동 특성?

+2

[내 타입은 복사해야 할 때?] (https://doc.rust-lang.org/stable/std/marker/trait.Copy.html#when-should-my-type-be-copy) – ljedrz

답변

6

이유 [Copy]하지를 구현하고 옵트 아웃 의미 대신에 선택 하에서의있을 수 있습니다 그 유형 SyncSend 같은 자동 특성?

Copy은이를 구현할 수있는 유형으로 자동으로 사용됩니다. 이 동작은 in December 2014으로 변경되었으므로 Rust 1.0 이전에는 너무 길지 않았습니다.

가능하면 Copy 특성을 항상 구현해야합니까?

반드시 그렇지는 않습니다. 라이브러리를 개발할 때 Copy을 유형에 구현할지 여부는 순방향 호환성에 영향을 미칩니다. 유형에 Copy 구현을 제거하는 것은 큰 변화입니다 (해당 유형의 사용자는 이동하는 대신 복사하는 유형에 의존 할 수 있습니다). 따라서 semantic versioning을 존중하기 위해 라이브러리에 주요 버전 충돌이 부과됩니다. 특히 유형이 Copy을 구현할 수 있지만 유형이 더 이상 Copy을 구현할 수 없도록 진화 할 가능성이 있다고 생각하면 안전하게 재생하고 해당 유형에 Copy을 구현하지 않아야합니다.

앞서 언급했듯이 Copy을 구현하지 않은 또 다른 이유는 큰 유형입니다. 일반적으로 "Clone이지만 Copy이 아님"은 값 복제가 "저렴"하지 않음을 나타 내기 때문에 이러한 유형에만 Clone을 구현하는 것이 유용 할 수 있습니다. 그러나 유형이 Copy이 아니더라도 값을 이동하는 것만으로도 큰 메모리 복사 작업이 발생할 수 있습니다 (운이 좋으면 컴파일러에서 최적화 할 수도 있지만).

Copy을 구현하면 유형 크기가 "커"인 경우 성능에 해칠 수 있습니까?

유형을 복사하지 않으면! 의 유일한 차이점은복사본 사이의 유일한 차이점은 이동으로 인해 소스를 사용할 수 없게 만듭니다 (예 : 이동 한 후 값을 사용하려고하면 컴파일러에서 오류가 발생 함) 반면 사본에는 해당하지 않습니다 '티; 두 작업 모두 얕은 메모리 복사본으로 구현됩니다.

+1

유형이 '복사'를 구현할 수 있다고하더라도 '이동'의미를 유지하려면 그렇게하지 않는 것이 좋습니다. – BurntSushi5

+1

또 다른 주목할 점은'Safe '기본값이 아닌'Copy'가 아니라는 것입니다. 원시 포인터를 래핑하여 자신의 버전의'Box'를 구현한다면, 그런 타입은 암시 적'Copy' 구현의 어떤 종류에 대해서도 적합 할 것입니다. 이것은 프로그래머가'Copy '의 정확성을 적극적으로 고려해야한다는 것을 의미합니다. '을 선택하고 필요한 경우 사용하지 않는 것을 잊지 마십시오. 현재의 디자인에서, 프로그래머가'Copy'를 고려하는 것을 잊으면 ... 아무 일도 일어나지 않고 아무 일도 일어나지 않습니다. –