capypad
0 Tage Serie
rust / expert
Snippet

Optimierung mit UnsafeCell

'UnsafeCell' ist der einzige legale Weg, in Rust eine mutable Referenz aus einer immutablen zu erhalten. Es ist das Primitiv hinter 'Cell' und 'RefCell'. Die direkte Verwendung ist hochgradig unsicher und erfordert, dass der Entwickler manuell garantiert, dass keine anderen Referenzen gleichzeitig existieren.

snippet.rs
rust
1
2
3
4
5
6
7
8
9
10
11
12
13
use std::cell::UnsafeCell;
 
struct MyCell<T> {
value: UnsafeCell<T>,
}
 
impl<T> MyCell<T> {
pub fn get_mut_unsafe(&self) -> &mut T {
unsafe { &mut *self.value.get() }
}
}
 
// Usage is dangerous and requires strict manual tracking of borrows.
Erklärung
1
self.value.get()
Gibt einen Raw Pointer (*mut T) auf den eingekapselten Wert zurück.
2
&mut *self.value.get()
Dereferenziert den Raw Pointer und wandelt ihn in eine mutable Referenz um.