为什么size_of可以用于未调整大小的类型?

时间:2018-08-03 14:09:58

标签: memory rust

documentation for std::mem::size_of没有提供使用&strString的示例,但是两个返回的大小都带有以下代码:

println!("The size of a string slice (&str): {}", mem::size_of::<&str>());
// OUTPUT: The size of a string slice (&str): 16
println!("The size of a growable string (String): {}", mem::size_of::<String>());
// OUTPUT: The size of a growable string (String): 24

据我了解,&str类型只是对"sequence of Unicode scalar values encoded as a stream of UTF-8 bytes"开头的引用。 &str是指两个指针的大小吗?我知道在64位系统上,指针的长度为8个字节。

mem::size_of::<str>()确实返回错误,就像我期望的那样。但是,String&String都返回大小。

1 个答案:

答案 0 :(得分:4)

  

为什么size_of可以用于未调整大小的类型?

不能。如果可以,它将被定义为:

pub const fn size_of<T: ?Sized>() -> usize
//                    ^^^^^^^^
  

为什么可以在[{&str / String / &String]上使用size_of?

&strString&String都是大小类型。

&str本质上是:

struct StringSlice {
    ptr: *const u8,
    len: usize,
}

String本质上是:

struct String {
    ptr: *const u8,
    len: usize,
    cap: usize,
}

&String本质上是:

struct StringRef {
    ptr: *const String,
}
  

指的是两个指针的大小

usize是一个整数类型,可以保证是本机指针的大小,所以...有点?

另请参阅: