0

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

4

1 回答 1

5

取决于编译器!没有优化的带有 std::move 的变体的汇编器将尝试删除“引用”,即使它是不必要的,没有 std::move 的变体的 ASM 代码不会 - 这会给您带来轻微的开销(调用到 std::move ,其中包含一些指令和顶层的附加 movl )就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
于 2018-12-01T03:32:39.077 回答