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



当我执行int a=std::move(b((b也是int(时,它和a=b一样吗?

取决于编译器!带有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;
}

汇编程序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

相关内容

最新更新