Зависит от компилятора!Ассемблер для варианта с std :: move без оптимизации попытается удалить «ссылку», даже если в этом нет необходимости, а код ASM для варианта без std :: move не будет - это приведет к небольшим издержкам (вызовto std :: move, который содержит несколько инструкций и дополнительный movl на верхнем уровне) с точки зрения инструкций процессора!
Тестовый код:
Пример без оптимизации с использованием GCC 8.2 в ассемблере X86_64:
#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), она действительно станет такой же с точки зрения инструкций процессора:
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