O retorno de uma tupla 2 é menos eficiente que o std :: pair?
Considere este código:
#include <utility>
#include <tuple>
std::pair<int, int> f1()
{
return std::make_pair(0x111, 0x222);
}
std::tuple<int, int> f2()
{
return std::make_tuple(0x111, 0x222);
}
Os clang 3 e 4 geram código semelhante para ambos no x86-64:
f1():
movabs rax,0x22200000111
ret
f2():
movabs rax,0x11100000222 ; opposite packing order, not important
ret
Mas o Clang 5 gera código diferente paraf2()
:
f2():
movabs rax,0x11100000222
mov QWORD PTR [rdi],rax
mov rax,rdi
ret
Assim como o GCC 4 ao GCC 7:
f2():
movabs rdx,0x11100000222
mov rax,rdi
mov QWORD PTR [rdi],rdx ; GCC 4-6 use 2 DWORD stores
ret
Por que o código gerado é pior ao retornar umstd::tuple
que se encaixa em um único registro, vsstd::pair
? Parece especialmente estranho, já que os clãs 3 e 4 pareciam ótimos, mas 5 não é.
Experimente aqui:https://godbolt.org/g/T2Yqrj