当我执行 int a = std::move(b) (b 也是 int)时,它与 a = b 相同吗?
问问题
93 次
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 回答