除了使用移动或Box以外,是否可以转让所有权?

时间:2018-06-24 03:18:51

标签: rust

Rust Book主要讨论移动机制,但是如果我的结构很大,我会看到Rust编译器生成的代码会在将值按值传递给函数时复制该结构的内容:

struct S2 {
    a: u64,
    b: u64,
    c: u64,
    d: u64,
    e: u64,
    f: u64,
    g: u64,
    h: u64,
    i: u64,
}

struct S {
    a: u64,
    b: u64,
    c: u64,
    d: u64,
    e: u64,
    f: u64,
    g: u64,
    h: u64,
    i: u64,
    s: S2,
}

fn xxx(xs: S) {
    println!("{:p}", &xs.s.a);
}

fn main() {
    let ms = S {
        a: 1,
        b: 1,
        c: 1,
        d: 1,
        e: 1,
        f: 1,
        g: 1,
        h: 1,
        i: 1,
        s: S2 {
            a: 1,
            b: 1,
            c: 1,
            d: 1,
            e: 1,
            f: 1,
            g: 1,
            h: 1,
            i: 1,
        },
    };
    println!("{:p}", &ms.s.a);
    xxx(ms);
}

在输出中,我看到Rust并没有优化ms到函数参数xs的移动以使用指针,而是复制了整个内容。我使用了opt-level=3

$ ./test
0x7ffeea23a8a8
0x7ffeea23a818

这是我应该担心的事情吗?建议对大型结构使用Box吗?

0 个答案:

没有答案