
170
이펙티브 러스트
let mut item = Item { contents: 42 };
copy_contents(&mut item, &item);
error[E0502]: cannot borrow `item` as immutable because it is also borrowed
as mutable
--> src/main.rs:159:30
|
159 | copy_contents(&mut item, &item);
| ------------- --------- ^^^^^ immutable borrow occurs here
| | |
| | mutable borrow occurs here
| mutable borrow later used by call
이와 같은 대여 규칙을 통해 컴파일러는 서로 다른 두 포인터가 동일한 메모리 지점을 참조하
는지 여부를 추적함으로써 에일리어싱
aliasing
과 관련된 판단을 훨씬 잘할 수 있다. 여러 불변 레
퍼런스가 가리키는 메모리 지점이 에일리어싱된 가변 레퍼런스를 통해 변경되지 않는다고 확
신할 수 있다면 컴파일러는 다음과 같은 장점을 가진 코드를 생성한다.
●
더 최적화된 코드
: 메모리에 담긴 내용이 중간에 변경되지 않는다는 것을 알기 때문에 레지스터에 안전
하게 캐싱할 수 있다.
●
더 안전한 코드
: 여러 스레드가 동기화되지 ...