简单的枚举应该派生出来吗?性能有什么不同吗?

sba*_*ant 9 rust

use std::collections::HashMap;

// #[derive(Copy, Clone)]
enum SomeEnum {
    Some1,
    Some2,
}

struct SomeStruct {
    pub some_enum: SomeEnum,
    pub s: String,
}

fn proc_struct(some_struct: &SomeStruct) {
    let mut map = HashMap::new();
    map.insert(String::from("any"), 0);

    match map.get(&some_struct.s) { // just to make a reference in SomeStruct
        Some(v) => {
            proc1(some_struct.some_enum);
            proc2(&some_struct.some_enum);
        }
        None => {}
    }
}

fn proc1(some: SomeEnum) {}

fn proc2(some: &SomeEnum) {}

fn main() {
    let some_struct = SomeStruct { some_enum: SomeEnum::Some1, s: String::from("s") };

    proc_struct(&some_struct);
}
Run Code Online (Sandbox Code Playgroud)

上面的代码产生以下错误:

error[E0507]: cannot move out of borrowed content
  --> src/main.rs:20:19
   |
20 |             proc1(some_struct.some_enum);
   |                   ^^^^^^^^^^^ cannot move out of borrowed content
Run Code Online (Sandbox Code Playgroud)

当我添加#[derive(Copy, Clone)]SomeEnum,它编译得很好.

简单的枚举是否应该SomeEnum得出Copy特征?功能proc1()和性能之间是否有任何差异proc2()

lje*_*drz 9

引用文档:

一般来说,如果你的类型可以实现Copy,它应该.

由于您SomeEnum没有复合变体(例如Vecs或Strings),我建议使其Copy能够.它似乎实际上小于对它的引用:

use std::mem;

enum SomeEnum {
    Some1,
    Some2,
}

fn main() {
    assert_eq!(1, mem::size_of::<SomeEnum>());
    assert_eq!(8, mem::size_of::<&SomeEnum>());
}
Run Code Online (Sandbox Code Playgroud)

虽然我怀疑在这种情况下你将能够发现任何性能差异.