gpt4 book ai didi

memory-management - 为什么 Nil 会增加一个枚举大小而不是另一个?如何为 Rust 枚举分配内存?

转载 作者:行者123 更新时间:2023-11-29 07:57:06 24 4
gpt4 key购买 nike

如果我定义以下枚举,Nil 不会增加枚举的大小:

  use std::mem::size_of;

enum Foo {
Cons(~char)
}

enum Bar {
Cons(~char),
Nil
}

println!("{}", size_of::<Foo>());
println!("{}", size_of::<Bar>());

// -> 4
// -> 4

另一方面:

  enum Foo {
Cons(char)
}

enum Foo {
Cons(char),
Nil
}

产量:

  // -> 4
// -> 8

当我定义一个枚举时发生了什么?如何为这些结构分配内存?

最佳答案

枚举的一种天真的方法是为其最大变体的内容分配足够的空间,外加一个判别式。这是一个标准的标记联合

Rust 比这聪明一点。 (它可能更聪明,但目前还没有。)它知道给定一个 ~T,至少有一个值是该内存位置不能 : 零。因此,在像您的 enum { Cons(~T), Nil } 这样的情况下,它能够将其优化为一个单词,内存中的任何非零值都意味着 Cons( ~T) 和内存中的零值表示 Nil

当你处理 char 时,优化不会发生:零是一个有效的代码点。碰巧的是,char 被定义为 Unicode 代码点,因此 实际上可以将变体优化到该空间中,那里有大量备用位最后(Unicode 字符只需要 21 位,所以在 32 位空间中我们有 11 个备用位)。这证明了 Rust 的枚举判别式优化目前并不是特别聪明。

关于memory-management - 为什么 Nil 会增加一个枚举大小而不是另一个?如何为 Rust 枚举分配内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22585614/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com