LINUX.ORG.RU

История изменений

Исправление Silerus, (текущая версия) :

struct Data(usize);
impl Data{
 pub fn print(&self){
    println!("val is: {}",self.0);
 }
}
fn test(key: &u8){
    if key ==&1{
    let xx = Box::new(Data(777));
    xx.print();
}else{
    let xx =Data(888);
    xx.print();
}
}
pub fn main(){
    test(&1);
    test(&0);

}

прошло через оптимизатор

example::main:
        sub     rsp, 24
        mov     edi, 1
        call    example::test
        xor     edi, edi
        call    example::test
        add     rsp, 24
        ret

example::test:
        sub     rsp, 24
        cmp     dil, 1
        jne     .LBB1_2
        mov     edi, 777
        call    <example::Data as example::print>::print
        jmp     .LBB1_3
.LBB1_2:
        mov     edi, 888
        call    <example::Data as example::print>::print
.LBB1_3:
        add     rsp, 24
        ret

<example::Data as example::print>::print:
        sub     rsp, 24
        mov     esi, edi
        lea     rdi, [rip + .L__unnamed_1]
        mov     edx, 1
        call    qword ptr [rip + std::io::stdio::_print@GOTPCREL]
        add     rsp, 24
        ret

.L__unnamed_1:
        .asciz  "\nval is: "

без

section .text

example::main:
        push    rbp
        mov     rbp, rsp
        sub     rsp, 16
        mov     byte ptr [rbp - 1], 1
        lea     rdi, [rbp - 1]
        call    example::test
        mov     byte ptr [rbp - 2], 0
        lea     rdi, [rbp - 2]
        call    example::test
        add     rsp, 16
        pop     rbp
        ret

example::test:
        push    rbp
        mov     rbp, rsp
        sub     rsp, 48
        mov     qword ptr [rbp - 8], rdi
        mov     rax, qword ptr [rbp - 8]
        mov     al, byte ptr [rax]
        cmp     al, 1
        jne     .LBB1_2
        mov     edi, 4
        call    __rust_alloc
        mov     rcx, rax
        mov     qword ptr [rbp - 24], rcx    ; Box allocation
        mov     dword ptr [rcx], 777          ; Store Data(777)
        mov     rax, qword ptr [rbp - 24]
        mov     qword ptr [rbp - 16], rax     ; xx = Box
        mov     rdi, qword ptr [rbp - 16]
        call    example::Data::print
        mov     rdi, qword ptr [rbp - 16]
        call    <alloc::boxed::Box<example::Data> as core::ops::drop::Drop>::drop
        jmp     .LBB1_3
.LBB1_2:
        mov     dword ptr [rbp - 28], 888     ; Data(888) on stack
        lea     rdi, [rbp - 28]
        call    example::Data::print
.LBB1_3:
        add     rsp, 48
        pop     rbp
        ret

example::Data::print:
        push    rbp
        mov     rbp, rsp
        sub     rsp, 16
        mov     qword ptr [rbp - 8], rdi
        mov     rax, qword ptr [rbp - 8]
        mov     eax, dword ptr [rax]
        mov     esi, eax
        lea     rdi, [rip + .L__unnamed_1]
        mov     al, 0
        call    printf
        add     rsp, 16
        pop     rbp
        ret

<alloc::boxed::Box<example::Data> as core::ops::drop::Drop>::drop:
        push    rbp
        mov     rbp, rsp
        sub     rsp, 16
        mov     qword ptr [rbp - 8], rdi
        mov     rax, qword ptr [rbp - 8]
        mov     rdi, rax
        mov     esi, 4
        mov     edx, 4
        call    __rust_dealloc
        add     rsp, 16
        pop     rbp
        ret

.L__unnamed_1:
        .asciz  "val is: %d\n"

Исходная версия Silerus, :

struct Data(usize);
impl Data{
 pub fn print(&self){
    println!("val is: {}",self.0);
 }
}
fn test(key: &u8){
    if key ==&1{
    let xx = Box::new(Data(777));
    xx.print();
}else{
    let xx =Data(888);
    xx.print();
}
}
pub fn main(){
    test(&1);
    test(&0);

}