2013-03-13 9 views
2

녹슬은 가비지 수집 될 힙의 개체를 참조하여 관리되는 포인터 (@T)을 사용합니다.Rust에서 무한 수명의 빌린 포인터에서 관리되는 포인터는 어떻게 다릅니 까?

(&T 또는 &lifetime/T)이라고도 쓰는 빌린 포인터를 사용합니다.

사실 @T은 빌린 포인터와 비슷하지만 특별한 무한한 수명이 있습니다. 그게 맞습니까? 아니면 아직 얻지 못한 미묘한 점이 있습니까? 그것이 맞다면, 왜 Rust의 디자이너는 마법의 일생을 소개하는 대신 새로운 유형의 포인터를 만들었습니까?

답변

1

저는 녹에 대해 전문적 지식이 없으므로 호기심이 많습니다. 따라서 내 답변을 최종 사실로 간주하지 마십시오.

수명이 다 된 포인터가 정의되어 있지 않을 수도 있다는 것을 알고 있기 때문에 추론 할 수만 있습니다. 그리고 &lifetime/Pointer 선언은 체커가 평생 분석에서 실제 포인터의 수명을 결정하는 데 도움이됩니다. 그래서 당신은 당신의 굴을 한 포인터가 무한한 수명을 가지고 있다고 말할 수 없습니다. 이미 존재하는 수명 만 사용할 수 있습니다.

나는 버로우 포인터가 항상 유효한 메모리를 가리키는 것으로 정적으로 증명된다는 점을 제외하면 다른 언어의 약한 포인터로 생각할 수 있습니다. 무한 수명의 버로우 포인터는 객체를 소유하지 않기 때문에 관리 포인터와 동일하지 않습니다.

이 주제에 대한 내 정보 출처는 Rust Borrowed Pointers Tutorial입니다. 읽어 보셨습니까?

3

머리말 : 녹이 아직 개발 중이며이 질문에 답한 이후 언어가 많이 바뀌 었습니다.

@ 포인터는 표준 라이브러리에서 제공하는 GcRc 스마트 포인터로 대체되어 언어에서 제거되기 직전입니다.

두 번째로, 수명에 대한 구문은 이제 &'a pointer입니다. References and Lifetimes Guide은 주제에 대한 포괄적이고 잘 쓰여진 자료입니다.

내 대답의 내용은이 두 가지 사항을 고려하면 여전히 적절합니다. 스택 (T)에서

  • : 녹

    는 메모리 할당 3 방법이있다. 이는 C에서와 동일합니다.
  • 작업의 힙 (@T)에서. 이 메모리는 GC로 처리 된 언어 에서처럼 가비지 수집됩니다.
  • 교환 힙에 (~T). 이 메모리의 수명은 누가 그것을 소유하고 있는지에 달려 있습니다.

그리고, 할당의 종류에 따라서는 @ 포인터 (대해서만 @ -allocated 값) (단 ~ -allocated 값)을 ~ 포인터를 사용하여 값에 대한 참조를 저장할 수하는 & 포인터 (빌린 포인터) 또는 * 포인터 (안전하지 않은 포인터).두번째는 할당 유형을 나타내는 반면, 본 실시 예에서는

let x: @int = @2; 

는 제 @는 포인터 타입을 나타낸다. 이 값은 @입니다. GC 값에 대한 포인터입니다.

let y: &int = @2; 

이것은 GC 값에 대한 것입니다.

& -pointers는 모든 유형의 메모리를 참조 할 수 있기 때문에 유용합니다. 함수를 작성할 때 호출자는 원하는 방식으로 값을 할당하여 함수를 호출 할 수 있으므로 매개 변수를 & -pointer로 선언해야합니다. 함수가 매개 변수를 @ -pointer로 선언하면 호출자는 힙 할당 값을 전달할 수 밖에 없습니다.

&- 포인터는 수명 개념을 도입합니다. 이것은 컴파일러가이 포인터가 할당 된 메모리보다 오래 지속되지 않도록 보장하기 위해 사용되는 개념입니다 (따라서 "안전한"포인터가됩니다).

@ 할당 된 값의 "수명"은 컴파일러에서 알 수 없으므로 컴파일러에 의해 정적으로 결정되지 않고 런타임에 의해 동적으로 결정됩니다.

+1

@pointer를 사용할 때마다 항상 유효하고 살아 있기 때문에 managed @ pointer의 수명은 무한대로 계산됩니다. –

+0

@DmitryBelyaev 주제에 대한 답변을 게시 하시겠습니까? 그것은 받아 들여질 것 같다;) – deadalnix

+0

나는 벌써 그것을했다 =) –