我在Rust官方文档中对此声明有些困惑。
https://doc.rust-lang.org/book/ch06-01-defining-an-enum.html
使用枚举而不是结构还有另一个优势:每个变体可以具有不同类型和数量的关联数据。版本4类型的IP地址将始终具有四个数字部分,其值将在0到255之间。如果我们想将V4地址存储为四个u8值,但仍将V6地址表示为一个字符串值,我们将无法到一个结构。枚举可以轻松处理这种情况:
#![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")); }
但是当我尝试使用结构将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);
}
答案 0 :(得分:1)
不一样。所有枚举元素都具有相同的大小!枚举元素的大小是最大变体的大小加上变体标识符的大小。
与结构有所不同。如果忽略填充,则结构的大小是其成员大小的总和。使用padding会更多:
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。