struct和enum之间的区别

时间:2019-07-01 05:14:03

标签: rust

我在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);      
}

1 个答案:

答案 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。