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