当我做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;
}
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)