当我做int a = std :: move(b)(b也是int)时,它是否与a = b相同?

Wei*_*ing 0 c++ stdmove

当我做int a = std :: move(b)(b也是int)时,它是否与a = b相同?

Skr*_*die 5

取决于编译器!具有std :: move而没有优化的变体的汇编程序将尝试删除"引用",即使它是不必要的,没有std :: move的变量的ASM代码也不会 - 这会给你一个轻微的开销(一个调用)在CPU指令方面,std :: move包含一些指令和顶层的附加movl!

测试代码:

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

#include <stdio.h>

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


int alternative()
{
    c = std::move(b);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

汇编程序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
Run Code Online (Sandbox Code Playgroud)

但是,如果打开优化(-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
Run Code Online (Sandbox Code Playgroud)