内存分配

静态内存分配

全局变量或静态变量静态内存分配,编译时内存分配在data段上,程序运行期间永久可用

let a = 0

struct S {
    static let a = 0
}
#![allow(unused)]
fn main() {
static mut A: usize = 0;
}
static int a = 0;
// arm64, AT&T

    .data
_a:
    .quad 0

栈内存分配

基础类型或栈上复合类型的局部变量栈内存分配
编译时生成管理栈的汇编代码,进入函数分配栈,离开函数回收栈
运行时内存分配在栈上,在函数内部可用

struct S {
    let a: Int
    let b: Int
    let c: Int
}

let a = 0
let s = S(a: 1, b: 2, c: 3)
#![allow(unused)]
fn main() {
struct S {
    a: i32,
    b: i32,
    c: i32,
}

let a = 0;
let s = S { a: 1, b: 2, c: 3 };
}
struct S {
    int a;
    int b;
    int c;
};

int a = 0;
struct S s = {1, 2, 3};
// 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*1]

    // struct S s = {1, 2, 3};
    mov w8, #1
    str w8, [x29, #-4*4]
    mov w8, #2
    str w8, [x29, #-4*3]
    mov w8, #3
    str w8, [x29, #-4*2]


    ldp x29, x30, [sp, #48]
    add sp, sp, #64

    ret

堆内存分配

堆上复合类型的局部变量堆内存分配
运行时内存分配在堆上,按照堆内存管理规则,在堆内存被释放前可用

在栈上保存堆内存的地址,即指针变量是分配在栈上的

class C {
    let a: Int
    
    init(a: Int) {
        self.a = a
    }
}

let c = C(a: 1)
#![allow(unused)]
fn main() {
struct C {
    a: i32,
}

let c = Box::new(C { a: 1 });
}
struct C {
    int a;
};

struct C *c = malloc(sizeof(struct C));
c->a = 1;
// arm64, AT&T

_main:
    sub sp, sp, #64
    stp x29, x30, [sp, #48]
    add x29, sp, #48


    // struct C *c = malloc(sizeof(struct C));
    mov	x0, #4
    bl _malloc
    str x0, [x29, #-8]

    // c->a = 1;
    mov w8, #1
    ldr x9, [x29, #-8]
    str w8, [x9]


    ldp x29, x30, [sp, #48]
    add sp, sp, #64

    ret