首页 > 解决方案 > 为什么 size_of 可以用于未调整大小的类型?

问题描述

文档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类型只是对“编码为 UTF-8 字节流的 Unicode 标量值序列”开头的引用。是&str指两个指针的大小吗?我知道一个指针在 64 位系统上是 8 个字节长。

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

标签: memoryrust

解决方案


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

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

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

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

&str, String, 和&String都是大小的类型。

A&str本质上是:

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

AString本质上是:

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

A&String本质上是:

struct StringRef {
    ptr: *const String,
}

指两个指针的大小

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

也可以看看:


推荐阅读