当我做int a = std :: move(b)(b也是int)时,它与a = b一样吗?

时间:2018-12-01 03:25:49

标签: c++ stdmove

当我做int a = std :: move(b)(b也是int)时,它与a = b一样吗?

1 个答案:

答案 0 :(得分:5)

取决于编译器!没有优化的带有std :: move的变体的汇编程序将尝试删除“引用”,即使它没有必要,没有std :: move的变体的ASM代码也不会-这给您带来一些开销(调用到std :: move,其中包含一些指令,并且在CPU指令方面还包含其他内容!

测试代码:

未在X86_64汇编器中使用GCC 8.2进行优化的示例:

#include <stdio.h>

int main()
{
    c = b;
    return 0;
}


int alternative()
{
    c = std::move(b);
    return 0;
}

汇编程序O0:

main:
        pushq   %rbp
        movq    %rsp, %rbp
        movl    b(%rip), %eax
        movl    %eax, c(%rip)
        movl    $0, %eax
        popq    %rbp
        ret

alternative():
        pushq   %rbp
        movq    %rsp, %rbp
        movl    $b, %edi
        call    std::remove_reference<int&>::type&& std::move<int&>(int&)
        movl    (%rax), %eax
        movl    %eax, c(%rip)
        movl    $0, %eax
        popq    %rbp
        ret

std::remove_reference<int&>::type&& std::move<int&>(int&):
        pushq   %rbp
        movq    %rsp, %rbp
        movq    %rdi, -8(%rbp)
        movq    -8(%rbp), %rax
        popq    %rbp
        ret

但是,如果启用优化(-O3),就CPU指令而言,它实际上变得相同:

main:
        movl    b(%rip), %eax
        movl    %eax, c(%rip)
        xorl    %eax, %eax
        ret

alternative():
        movl    b(%rip), %eax
        movl    %eax, c(%rip)
        xorl    %eax, %eax
        ret