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

questionAnswers(2)

yourAnswerToTheQuestion