omo otimizar os valores de retorno da função em C e C ++ no x86-6
O x86-64 ABI especifica dois registros de retorno:rax
erdx
, ambos de 64 bits (8 bytes) de tamanh
Supondo que o x86-64 seja a única plataforma segmentada, qual destas duas funções:
uint64_t f(uint64_t * const secondReturnValue) {
/* Calculate a and b. */
*secondReturnValue = b;
return a;
}
std::pair<uint64_t, uint64_t> g() {
/* Calculate a and b, same as in f() above. */
return { a, b };
}
produziria melhor desempenho, dado o estado atual dos compiladores C / C ++ direcionados a x86-64? Existem armadilhas quanto ao desempenho usando uma ou a outra versão? Os compiladores (GCC, Clang) sempre conseguem otimizar ostd::pair
a ser retornado emrax
erdx
?
ATUALIZAR Geralmente, retornar um par é mais rápido se o compilador otimizar ostd::pair
métodos (exemplos de saída binária comGCC 5.3.0 eClang 3.8.0). E sef()
não está embutido, o compilador deve gerar código para gravar um valor na memória, por exemplo:
movq b, (%rdi)
movq a, %rax
retq
Mas no caso deg()
basta o compilador fazer:
movq a, %rax
movq b, %rdx
retq
Como as instruções para escrever valores na memória geralmente são mais lentas que as instruções para escrever valores nos registros, a segunda versão deve ser mais rápid