Рассмотрим этот код:
#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);
}
Clang 3 и 4 генерируют одинаковый код для обоих на x86-64:
f1():
movabs rax,0x22200000111
ret
f2():
movabs rax,0x11100000222 ; opposite packing order, not important
ret
Но Clang 5 генерирует другой код для f2()
:
f2():
movabs rax,0x11100000222
mov QWORD PTR [rdi],rax
mov rax,rdi
ret
Как сделать GCC 4 - GCC 7:
f2():
movabs rdx,0x11100000222
mov rax,rdi
mov QWORD PTR [rdi],rdx ; GCC 4-6 use 2 DWORD stores
ret
Почему сгенерированный код хуже, когда возвращает std::tuple
который помещается в один регистр, против std::pair
? Это кажется особенно странным, поскольку Clang 3 и 4 казались оптимальными, а 5 - нет.
Попробуйте это здесь: https://godbolt.org/g/T2Yqrj