memory - 为什么 size_of 可以用于未调整大小的类型?
问题描述
的文档std::mem::size_of
没有提供&str
或String
正在使用的示例,但都使用以下代码返回大小:
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
大小。
解决方案
为什么 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
是一个整数类型,保证是本机指针的大小,所以......有点?
也可以看看:
推荐阅读
- sql-server - 如何使用存储过程将订单表拆分为标题表和明细表?
- python - pandas,当 RID == 2, VIS2 == 'sc' 时,'LIMM' 的值用于填充 RID == 2, VIS2 == 'bl'
- canvas - 以快速的方式将画布捕获到视频
- php - Trying to Create a Profile Image system
- scala - 需要获取同一文件的scala中不同ID的总数
- objective-c - 如何在终端中更改目录?
- git - How to check with Git before merge if the merge is necessary? ("Already up-to-date.")
- node.js - NodeJS Express req.body 返回空字符串对象
- rxjs - Rx - How to apply to stream distinctUntilChanged that allows emit duplicate item after some period?
- c# - UWP:默认 xaml 文件(视图)未按预期显示