일단 비교를 위한 C++ 코드임
직관적으로 생각하면 a에 2를 대입하는게 의미가 없을것 같지만
대입문을 날려버리면 a랑 b가 가르키는 대상이 같을땐 동작이 달라질수있음
예를들어 a랑 b가 똑같고 내부값이 0이면 원래는 ret이 2라서 true인데 최적화한다고 날리면 false로 바뀜
이걸 pointer aliasing이라고 하고 https://en.m.wikipedia.org/wiki/Pointer_aliasing
C99의 restrict 키워드나 컴파일러들의 자체확장으로 직접 noalias를 보장하면 최적화를 해주긴 하는데
이 경우 실수로 alias를 해버리면 UB가 일어나게 됨
이제 Rust의 참조를 보면
소유권상 &mut 참조는 유일하기 때문에 a와 b가 같을수가 없음
그래서 Rust에선 항상 &mut를 noalias 포인터라고 생각해주기 때문에 mov가 안전하게 날라갈수 있게됨
노알리아스
노알라스
https://godbolt.org/z/84vfW5