当我做int a = std :: move(b)(b也是int)时,它与a = b一样吗?
答案 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