AnyMap 的实现和 'struct Port(u32);' 的运行时开销



我正在阅读"24 Days of Rust",AnyMap用法的例子让我大吃一惊。请考虑以下代码:

#[deriving(Show)]
struct Port(u32);
#[deriving(Show)]
struct ConnectionLimit(u32);

它说:

这里的PortConnectionLimit类型是对 基础整数(运行时没有开销

很好,我可以理解如何实现这一目标。在编译期间检查所有类型,在运行时我们只有 u32。但是在这种情况下,如何创建从某些TypeIdBox<Any>的地图?以及如何将 Any 转换为任何子类型,例如 u32?

AnyMap的源代码非常复杂,并且涉及大量的元编程。它是如何工作的?也许"24 天的 Rust"中只有一个错误,PortConnectionLimit实际上有运行时开销?

实际上,在C,C++和其他系统语言中,具有相同内存表示的不同类型是很常见的。

在内存中:

  • u32是 4 个连续字节的内存
  • Port是 4 个连续字节的内存
  • ConnectionLimit是 4 个连续字节的内存

值得注意的是,与许多其他语言相比,对于这些类型的每个实例,内存中没有存储"虚拟表"或其他无关信息。

至于AnyMap,在映射中存储对象的点,编译器知道对象的类型,因此可以提供正确的TypeId。然后,这必须与对象数据一起珍贵地携带,因为如果丢失,则无法恢复。

最新更新