变量赋值
基础类型
复制值
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