首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >结构和枚举的区别

结构和枚举的区别
EN

Stack Overflow用户
提问于 2019-07-01 05:14:03
回答 1查看 1.3K关注 0票数 2

我对这句话出自“锈书”很困惑

使用枚举而不是结构还有另一个好处:每个变体可以有不同类型和数量的关联数据。Version 4类型的IP地址将始终有4个数值组件,其值介于0到255之间。如果我们想将V4地址存储为四个u8值,但仍然将V6地址表示为一个String值,那么将无法使用结构。Enum轻松地处理此案件: # fn main() { enum IpAddr { V4(u8,u8),V6(String),} let home = IpAddr::V4(127,0,0,1);让循环返回=IpAddr::V6(字符串:from(“:1”));}

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

代码语言:javascript
复制
#[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);      
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-07-01 05:39:24

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

用结构来说有点不一样。如果忽略填充,则结构的大小是其成员大小的总和。有了填充物,就会有更多:

代码语言:javascript
复制
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)
}

在这里,我们可以看到不同之处:

  • Enum: 128;最大变量为64,变量标识符为64。
  • 结构: 192;对齐到64位,所以我们有54位填充。

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

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56830274

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档