Rust-소유권

프로그램의 메모리는 다음에 할당 할 수 있습니다.

  • Stack
  • Heap

스택

스택은 마지막 선입 선출 순서를 따릅니다. Stack은 컴파일 타임에 크기가 알려진 데이터 값을 저장합니다. 예를 들어, 고정 크기 i32의 변수는 스택 할당 후보입니다. 크기는 컴파일 타임에 알려져 있습니다. 크기가 고정되어 있으므로 모든 스칼라 유형을 스택에 저장할 수 있습니다.

런타임에 값이 할당되는 문자열의 예를 고려하십시오. 이러한 문자열의 정확한 크기는 컴파일 타임에 확인할 수 없습니다. 따라서 스택 할당 후보가 아니라 힙 할당 후보입니다.

더미

힙 메모리는 컴파일 타임에 크기를 알 수없는 데이터 값을 저장합니다. 동적 데이터를 저장하는 데 사용됩니다. 간단히 말해서 힙 메모리는 프로그램의 수명주기 동안 변경 될 수있는 데이터 값에 할당됩니다. 힙은 스택과 비교할 때 덜 구성되는 메모리 영역입니다.

소유권이란 무엇입니까?

Rust의 각 값에는 다음과 같은 변수가 있습니다. owner가치의. Rust에 저장된 모든 데이터에는 소유자가 있습니다. 예를 들어 -let age = 30 구문 에서 age 는 값 30 의 소유자입니다 .

  • 각 데이터는 한 번에 한 명의 소유자 만 가질 수 있습니다.

  • 두 변수는 동일한 메모리 위치를 가리킬 수 없습니다. 변수는 항상 다른 메모리 위치를 가리 킵니다.

소유권 이전

가치의 소유권은 다음에 의해 양도 될 수 있습니다.

  • 한 변수의 값을 다른 변수에 할당합니다.

  • 함수에 값을 전달합니다.

  • 함수에서 값을 반환합니다.

한 변수의 값을 다른 변수에 할당

언어로서 Rust의 주요 판매 포인트는 메모리 안전성입니다. 누가 무엇을 언제 사용할 수 있는지에 대한 엄격한 제어를 통해 메모리 안전성이 달성됩니다.

다음 스 니펫을 고려하십시오-

fn main(){
   let v = vec![1,2,3]; 
   // vector v owns the object in heap

   //only a single variable owns the heap memory at any given time
   let v2 = v; 
   // here two variables owns heap value,
   //two pointers to the same content is not allowed in rust

   //Rust is very smart in terms of memory access ,so it detects a race condition
   //as two variables point to same heap

   println!("{:?}",v);
}

위의 예는 벡터 v를 선언합니다. 소유권 개념은 하나의 변수 만 리소스에 바인딩된다는 것입니다. v 리소스에 바인딩하거나 v2리소스에 바인딩합니다. 위의 예에서는 오류가 발생합니다- 이동 된 값 사용 :`v` . 이는 리소스의 소유권이 v2로 이전되기 때문입니다. 이는 소유권이 v에서 v2 (v2 = v)로 이동되고 v는 이동 후 무효화됨을 의미합니다.

함수에 값 전달

값의 소유권은 힙의 객체를 클로저 또는 함수로 전달할 때도 변경됩니다.

fn main(){
   let v = vec![1,2,3];     // vector v owns the object in heap
   let v2 = v;              // moves ownership to v2
   display(v2);             // v2 is moved to display and v2 is invalidated
   println!("In main {:?}",v2);    //v2 is No longer usable here
}
fn display(v:Vec<i32>){
   println!("inside display {:?}",v);
}

함수에서 값 반환

함수 실행이 완료되면 함수에 전달 된 소유권이 무효화됩니다. 이에 대한 한 가지 해결 방법은 함수가 소유 한 개체를 호출자에게 반환하도록하는 것입니다.

fn main(){
   let v = vec![1,2,3];       // vector v owns the object in heap
   let v2 = v;                // moves ownership to v2
   let v2_return = display(v2);    
   println!("In main {:?}",v2_return);
}
fn display(v:Vec<i32>)->Vec<i32> { 
   // returning same vector
   println!("inside display {:?}",v);
}

소유권 및 기본 유형

기본 유형의 경우 한 변수의 내용이 다른 변수로 복사됩니다. 따라서 소유권 이전이 발생하지 않습니다. 이는 기본 변수가 객체보다 적은 자원을 필요로하기 때문입니다. 다음 예를 고려하십시오-

fn main(){
   let u1 = 10;
   let u2 = u1;  // u1 value copied(not moved) to u2

   println!("u1 = {}",u1);
}

출력은 – 10입니다.