rust-quiz:030-clone-pointers.rs

godme發表於2022-07-15
use std::rc::Rc;

struct A;

fn p<X>(x: X) {
    match std::mem::size_of::<X>() {
        0 => print!("0"),
        _ => print!("1"),
    }
}

fn main() {
    let a = &A;
    p(a);
    p(a.clone());

    let b = &();
    p(b);
    p(b.clone());

    let c = Rc::new(());
    p(Rc::clone(&c));
    p(c.clone());
}
  • zst
    對於zst型別,是不佔用實際記憶體的。

  • 方法查詢
    T -> &T -> &mut T

  • p
    不難看出來,對於zst列印0,其他型別列印1

  • a
    首先,Azst,但是&A屬於引用,不是zst型別,列印1
    a.clone()A本身沒有實現Clone,因此方法查詢時就會找到&A
    此時的&A 作為&T

      #[stable(feature = "rust1", since = "1.0.0")]
      impl<T: ?Sized> Clone for &T {
          #[inline]
          #[rustc_diagnostic_item = "noop_method_clone"]
          fn clone(&self) -> Self {
              *self
          }
      }

    已經實現了clone,型別不變,還是&A,列印1

  • b
    同樣的,()zst,但是&()有大小,列印1
    因為()實現了Clone,返回的當然是(),因此().clone()列印0

  • c
    Rc作為物件,本身肯定不是zst,列印1
    同時rcclone只是增加了引用計數,還是rc,列印1

111011

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章