У меня нет особенно четкого понимания правил псевдонима Rust (и, насколько я слышал, они четко не определены), но мне трудно понять, что делает этот пример кода в std::slice
документации, хорошо. Повторюсь здесь:
let x = &mut [1, 2, 4];
let x_ptr = x.as_mut_ptr();
unsafe {
for i in 0..x.len() {
*x_ptr.offset(i as isize) += 2;
}
}
assert_eq!(x, &[3, 4, 6]);
Проблема, которую я вижу здесь, заключается в том, что x
, будучи &mut
ссылкой, может считаться компилятором уникальным. Содержимое x
изменяется с помощью x_ptr
, а затем считывается с помощью x
, и я не вижу причин, по которым компилятор не мог просто предположить, что x
не был изменен, поскольку он никогда не изменялся с помощью единственной существующей ссылки &mut
.
Итак, что мне здесь не хватает?
Обязан ли компилятор предполагать, что
*mut T
может быть псевдонимом&mut T
, хотя обычно разрешено предполагать, что&mut T
никогда не использует псевдоним другого&mut T
?Блок
unsafe
действует как своего рода барьер псевдонима, когда компилятор предполагает, что код внутри него мог изменить что-либо в области видимости?Этот пример кода не работает?
Если есть какое-то стабильное правило, которое делает этот пример приемлемым, что именно? Какова его степень? Насколько я должен беспокоиться о том, что предположения о псевдониме нарушают случайные вещи в unsafe
коде Rust?
x
иx_ptr
содержат адрес одного и того же типа, LLVM необходимо перезагрузитьx
- person Stargateur   schedule 28.09.2018