לדלג לתוכן

3.5 - מקצים השמדה ואינווריאנטים של בעלות - פתרון

פתרון בדיקת ההתחייבות למקצה

הבדיקה הבאה מתווספת אחרי הגדרת Owned. המונה האטומי משמש רק כדי לאפשר מצב גלובלי בדוגמה, והניסוי עצמו רץ בתהליכון יחיד.

use std::sync::atomic::{AtomicUsize, Ordering};

#[repr(align(64))]
struct Aligned(u64);
static DROPS: AtomicUsize = AtomicUsize::new(0);
struct Empty;
impl Drop for Empty {
    fn drop(&mut self) { DROPS.fetch_add(1, Ordering::SeqCst); }
}

fn main() {
    let mut aligned = Owned::new(Aligned(7));
    let address = (aligned.get() as *const Aligned).addr();
    assert_eq!(address % 64, 0);
    aligned.get_mut().0 = 9;
    assert_eq!(aligned.get().0, 9);
    {
        let empty = Owned::new(Empty);
        let _read = empty.get();
    }
    assert_eq!(DROPS.load(Ordering::SeqCst), 1);
}

יישור אחד אינו מספיק ל־Aligned. יצירת הפניה אל ערך שלא עומד בדרישת היישור יכולה להפר את חוזי השפה גם אם כתובת האחסון עצמה נגישה. עבור Empty אין אחסון חיובי לשחרר, אבל עדיין יש פעולה לוגית של השמדה שחייבת להתבצע פעם אחת.