2017-06-22 25 views
3
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); 
} 

以上代码生成以下错误:应该简单的枚举派生复制?性能有什么不同?

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 

当我添加#[derive(Copy, Clone)]SomeEnum,它编译罚款。

SomeEnum这样的简单枚举派生出Copy特质吗? 功能proc1()proc2()之间的性能有任何区别吗?

+1

作为参考,这是[交叉发布到Rust用户论坛](https://users.rust-lang.org/t/should-simple-enum-derive-copy-trait/11483?u=shepmaster )。 – Shepmaster

回答

5

援引docs

Generally speaking, if your type can implement Copy , it should.

由于您的SomeEnum有没有复合的变体(例如Vec S或String S),我建议使它Copy能。看来,它实际上比对它的引用更小:

use std::mem; 

enum SomeEnum { 
    Some1, 
    Some2, 
} 

fn main() { 
    assert_eq!(1, mem::size_of::<SomeEnum>()); 
    assert_eq!(8, mem::size_of::<&SomeEnum>()); 
} 

虽然我怀疑,在这种情况下,你将能够探测到任何性能差异。