我正在阅读"24 Days of Rust",AnyMap
用法的例子让我大吃一惊。请考虑以下代码:
#[deriving(Show)]
struct Port(u32);
#[deriving(Show)]
struct ConnectionLimit(u32);
它说:
这里的
Port
和ConnectionLimit
类型是对 基础整数(运行时没有开销!
很好,我可以理解如何实现这一目标。在编译期间检查所有类型,在运行时我们只有 u32。但是在这种情况下,如何创建从某些TypeId
到Box<Any>
的地图?以及如何将 Any 转换为任何子类型,例如 u32?
AnyMap
的源代码非常复杂,并且涉及大量的元编程。它是如何工作的?也许"24 天的 Rust"中只有一个错误,Port
和ConnectionLimit
实际上有运行时开销?
实际上,在C,C++和其他系统语言中,具有相同内存表示的不同类型是很常见的。
在内存中:
u32
是 4 个连续字节的内存Port
是 4 个连续字节的内存ConnectionLimit
是 4 个连续字节的内存
值得注意的是,与许多其他语言相比,对于这些类型的每个实例,内存中没有存储"虚拟表"或其他无关信息。
至于AnyMap
,在映射中存储对象的点,编译器知道对象的类型,因此可以提供正确的TypeId
。然后,这必须与对象数据一起珍贵地携带,因为如果丢失,则无法恢复。