gpt4 book ai didi

rust - 结构和枚举之间的区别

转载 作者:行者123 更新时间:2023-11-29 08:34:56 25 4
gpt4 key购买 nike

我对 this statement from the Rust Book 感到困惑:

There’s another advantage to using an enum rather than a struct: each variant can have different types and amounts of associated data. Version four type IP addresses will always have four numeric components that will have values between 0 and 255. If we wanted to store V4 addresses as four u8 values but still express V6 addresses as one String value, we wouldn’t be able to with a struct. Enums handle this case with ease:

#![allow(unused_variables)]
fn main() {
enum IpAddr {
V4(u8, u8, u8, u8),
V6(String),
}

let home = IpAddr::V4(127, 0, 0, 1);

let loopback = IpAddr::V6(String::from("::1"));
}

但是当我尝试使用 structs 将 V4 地址存储为四个 u8 值但仍将 V6 地址表示为一个 String 值时,它也是做同样的事情没有任何错误。

#[derive(Debug)]
struct IpAddr {
V4:(u8, u8, u8, u8),
V6:String,
}

fn main () {
let home = IpAddr {
V4: (127, 1, 1, 1),
V6: String::from("Hello"),
};
println!("{:#?}", home);
}

最佳答案

这不一样。所有枚举元素都具有完全相同的大小!枚举元素的大小是最大变体的大小加上变体标识符。

对于结构它有点不同。如果我们忽略填充,则结构的大小是其成员大小的总和。使用填充会多一点:

fn main() {
let size = std::mem::size_of::<TheEnum>();
println!("Enum: {}", size * 8);

let size = std::mem::size_of::<TheStruct>();
println!("Struct: {}", size * 8);
}

struct TheStruct {
a: u64,
b: u8,
c: u64
}

enum TheEnum {
A(u64),
B(u8),
C(u64)
}

这里我们可以看出区别:

  • 枚举:128;最大变体为 64,变体标识符为 64。

  • 结构:192;对齐到 64 位,所以我们有 54 位填充

另一个区别在于您使用枚举和结构的方式。在枚举中,您只需初始化其中一个变体。在您的情况下 - IPv4 或 IPv6。使用示例中的结构,您必须同时提供 V4 和 v6 地址。您不能仅提供 V4 或仅提供 V6。

关于rust - 结构和枚举之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56830274/

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