diff --git a/source/chapter4/3sv39-implementation-1.rst b/source/chapter4/3sv39-implementation-1.rst index b8c980c8..c6d43b96 100644 --- a/source/chapter4/3sv39-implementation-1.rst +++ b/source/chapter4/3sv39-implementation-1.rst @@ -123,7 +123,7 @@ SV39 多级页表的硬件机制 需要注意的是,当我们使用 ``From`` Trait 的 ``from`` 方法来构造一个转换后类型的实例的时候,``from`` 的参数已经指明了转换前的类型,因而 Rust 编译器知道该使用哪个实现;而使用 ``Into`` Trait 的 ``into`` 方法来将当前类型转化为另一种类型的时候,它并没有参数,因而函数签名中并没有指出要转化为哪一个类型,则我们必须在其它地方 *显式* 指出目标类型。比如,当我们要将 ``u.into()`` 绑定到一个新变量 ``t`` 的时候,必须通过 ``let t: T`` 显式声明 ``t`` 的类型;又或是将 ``u.into()`` 的结果作为参数传给某一个函数,那么由于这个函数的函数签名中指出了传入位置的参数的类型,所以 Rust 编译器也就明确知道转换的类型。 - 请注意,解引用 ``Deref`` Trait 是 Rust 编译器唯一允许的一种隐式类型转换,而对于其他的类型转换,我们必须手动调用类型转化方法或者是显式给出转换前后的类型。这体现了 Rust 的类型安全特性,在 C/C++ 中并不是如此,比如两个不同的整数/浮点数类型进行二元运算的时候,编译器经常要先进行隐式类型转换使两个操作数类型相同,而后再进行运算,导致了很多数值溢出或精度损失问题。Rust 不会进行这种隐式类型转换,它会在编译期直接报错,提示两个操作数类型不匹配。 + 请注意,解引用 ``Deref`` Trait 是 Rust 编译器允许的一种隐式类型转换,而对于大部分类型转换,我们必须手动调用类型转化方法或者是显式给出转换前后的类型。这体现了 Rust 的类型安全特性,在 C/C++ 中并不是如此,比如两个不同的整数/浮点数类型进行二元运算的时候,编译器经常要先进行隐式类型转换使两个操作数类型相同,而后再进行运算,导致了很多数值溢出或精度损失问题。Rust 不会进行这种隐式类型转换,它会在编译期直接报错,提示两个操作数类型不匹配。 其次,地址和页号之间可以相互转换。我们这里仍以物理地址和物理页号之间的转换为例: