Когда я делаю int a = std :: move (b) (b также int), это то же самое, что просто a = b? - PullRequest
0 голосов
/ 01 декабря 2018

Когда я делаю int a = std :: move (b) (b также int), это то же самое, что просто a = b?

1 Ответ

0 голосов
/ 01 декабря 2018

Зависит от компилятора!Ассемблер для варианта с 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
...