2016-09-21 6 views
2

내가into_boxed_slice() 메소드의 사용법은 무엇입니까? <code>Vec<T></code>에 사용할 수있는 방법을 보면

into_boxed_slice(self) -> Box<[T]> 

String를 우연히 발견했다 또한 방법 (into_boxed_str(self))가 있습니다. Vec<T>/String에 대한 Deref의 유용성은 공유 슬라이스 (&[T])처럼 취급 될 수 있지만 분명히 FFI를 제외하고는 소유 슬라이스 (Box<[T]>)에 대해서는 사용하지 않습니다. Rust GitHub repo는 소수의 경우에만 into_boxed_slice()을 사용합니다.

박스형 슬라이스를 만드는 방법은 std에서 가능하며이 컨테이너는 기본 페이지에 나열되어 있으므로 유용한 정보가 누락 될 수 있습니다. 소유 슬라이스를 사용하여 Vec<T> 또는 String을 사용해야하는 경우는 무엇입니까?

+3

* 이유가 확실하지 않지만 'Box <[T]>'및 'Box '은 용량이 필요하지 않으므로 포인터 크기의 정수가 하나 작습니다. 크기를 조정할 수 없으므로 – Shepmaster

+0

이것에 대해 생각했지만, 전용 컨테이너를 갖기에 충분한 이유가되지는 않습니다. – ljedrz

+0

"전용 컨테이너"가 무슨 뜻인지 잘 모르겠습니다. 이것은 기존 타입의 조합 인'Box'와'[T]'또는'str'입니다. 'Box '과 크게 다르지 않습니다. – Shepmaster

답변

2

into_boxed_slice()을 사용하는 가장 큰 이유는 박스형 슬라이스뿐만 많은 메모리를 차지한다는 것이다 :

  • 기본 데이터 자체
  • 데이터
  • 의 전체 길이를 제공하는 length 분야

Vec 표준을 사용하는 경우 Vec의 경우 실제로 더 많은 메모리를 확보 할 수 있으며 일반적으로 가능합니다. 새로운 요소가 추가 될 때마다 더 많은 메모리를 할당하지 않아도됩니다. 그 공간은 본질적으로 사용되지 않습니다. Vec::len()Vec::capacity()을 비교하여 여분의 메모리가 얼마나 사용되고 있는지 확인할 수 있습니다.

into_boxed_slice() 기능이 유용하다고 생각하는 주요 장소는 메모리 내 파일 캐시입니다. 단순화를 위해 Vec을 사용하여 파일을 메모리에로드하지만 일단 파일이로드되면 더 이상 요소를 추가하거나 제거 할 필요가 없습니다. 그래서 나는 into_boxed_slice()을 사용하여 박스형 조각으로 변환합니다. 같은 것을 달성하는 다른 방법이 있지만이 경우 단일 함수 호출이 더 쉽습니다. 나는 박스형 슬라이스 타입 (Vec과 반대)을 좋아한다. 왜냐하면 캐시 된 파일이 수정 될 의도가 없다는 것을 분명하게 알리기 때문이다.

참고 : 추가 오버 헤드없이 실제로 Vec을 사용할 수 있습니다. Vec::shrink_to_fit()을 호출하면 Vec에서 추가 할당 된 요소가 제거됩니다.

+0

올바르게 기억하면'into_boxed_slice()'도'shrink_to_fit()'를 호출합니다. 유효한 대답입니다. 나는 숨겨진 혜택을 배우기를 희망했지만 아무 것도 없었을 수도 있습니다. 곧 놀라운 일이 없다면 받아 들일 것입니다. – ljedrz