u32
占用4个字节的内存,String
占用3个指针大小的整数(用于位置,大小和保留空间),以及堆栈上的一些数量。
对我来说,这意味着Rust在执行代码时不知道什么类型存储在特定位置,因为该知识将需要更多的内存。
但是同时,为了能够解释该位置的字节,是否不需要知道在0xfa3d2f10中存储了什么类型?例如,要知道接下来的字节构成堆上String
的规范吗?
Rust如何在运行时存储类型?
通常不。
Rust不知道,当执行代码时,在特定位置存储什么类型
正确
不需要知道存储什么类型
否,内存中的字节应该正确,其余代码假定相同。结构中字段的偏移量已烘焙到生成的机器代码中。
执行动态分配时,使用fat指针。它由指向数据的指针和指向vtable的指针组成,该指针组成了所讨论的接口。 vtable可以视为类型的表示形式,但是它没有很多您可能会认为属于“类型”的信息(除非特征需要它)。动态分配在Rust中并不常见,因为大多数人在可能的情况下更喜欢静态分配,但是两种技术都有其好处。
还有TypeId
之类的概念,它可以表示一个特定类型,但只能表示类型的子集。除了“这些类型是否相同”之外,它也没有提供太多功能。
是,可以,这是使Rust变得如此有趣的原因之一。
在像C或C ++这样的语言中,没有什么可以保护程序员避免犯一些愚蠢的错误,这些错误会弄乱内存中漂浮的那些字节。犯这些错误是由于内存安全而导致错误的原因。与其将您的密码解释为密码,不如将其解释为您的用户名并输出给攻击者(哎呀!)
Rust以强大的类型系统和工具(例如借用检查器)的形式提供了防范措施,但是仍然都是在编译时完成的。 不安全 Rust启用了这些危险的工具,但要折衷,现在程序员应该自己承担所有保证,就像他们再次编写C或C ++一样。
另请参见: