变量赋值

基础类型

复制值

let a = 0 var a2 = a a2 += 1 // a: 0, a2: 1
#![allow(unused)] fn main() { let a = 0; let mut a2 = a; a2 += 1; println!("a: {}, a2: {}", a, a2); }
int a = 0; int a2 = a; a2 += 1; // a: 0, a2: 1
// arm64, AT&T _main: sub sp, sp, #64 stp x29, x30, [sp, #48] add x29, sp, #48 // int a = 0; mov w8, #0 str w8, [x29, #-4] // int a2 = a; ldr w8, [x29, #-4] str w8, [x29, #-4*2] // a2 += 1; ldr w8, [x29, #-4*2] add w8, w8, #1 str w8, [x29, #-4*2] ldp x29, x30, [sp, #48] add sp, sp, #64 ret

栈上复合类型

复制值

struct S { var a: Int } let s = S(a: 0) var s2 = s s2.a += 1 // s.a: 0, s2.a: 1
#![allow(unused)] fn main() { #[derive(Clone)] struct S { a: i32, } let s = S {a :0}; let mut s2 = s.clone(); s2.a += 1; println!("s.a: {}, s2.a: {}", s.a, s2.a); }
struct S { int a; }; struct S s = {0}; struct S s2 = s; s2.a += 1; // s.a: 0, s2.a: 1
// arm64, AT&T _main: sub sp, sp, #64 stp x29, x30, [sp, #48] add x29, sp, #48 // struct S s = {0}; mov w8, #0 str w8, [x29, #-4] // struct S s2 = s; ldr w8, [x29, #-4] str w8, [x29, #-4*2] // s2.a += 1; ldr w8, [x29, #-4*2] add w8, w8, #1 str w8, [x29, #-4*2] ldp x29, x30, [sp, #48] add sp, sp, #64 ret

堆上复合类型

复制值

堆上复合类型复制值的时候,分配新的堆内存,并把值完全复制了一份

protocol Copyable { func copy() -> Self } class C: Copyable { var a: Int required init(a: Int) { self.a = a } func copy() -> Self { Self.init(a: a) } } let c = C(a: 0) let c2 = c.copy() c2.a += 1 // c.a: 0, c2.a: 1
#![allow(unused)] fn main() { #[derive(Clone)] struct C { a: i32, } let c = Box::new(C { a: 0 }); let mut c2 = c.clone(); c2.a += 1; println!("c.a: {}, c2.a: {}", c.a, c2.a); }
struct C { int a; }; struct C *c = malloc(sizeof(struct C)); c->a = 0; struct C *c2 = malloc(sizeof(struct C)); c2->a = c->a; c2->a += 1; // c.a: 0, c2.a: 1

复制地址/引用

堆上复合类型复制地址/引用的时候,仅把堆内存地址复制了一份放在栈上
两个指针变量共享同一份堆内存,因此修改其中一个指向的值,也会更改另一个指向的值

class C { var a: Int init(a: Int) { self.a = a } } let c = C(a: 0) let c2 = c c2.a += 1 // c.a: 1, c2.a: 1
#![allow(unused)] fn main() { struct C { a: i32, } let mut c = Box::new(C { a: 0 }); let c2 = &mut c; c2.a += 1; println!("c2.a: {}", c2.a); println!("c.a: {}", c.a); }
struct C { int a; }; struct C *c = malloc(sizeof(struct C)); c->a = 0; struct C *c2 = c; c2->a += 1; // c.a: 1, c2.a: 1