В системе x86_64 обе функции могут быть скомпилированы в один и тот же код. Я «замаскировал» разборку примерно эквивалентным кодом C:
f_or_g:
pushq %rbp ; // Standard stack frame setup
movq %rsp, %rbp ; // same
movl OFFSET1(%rip), %eax ; eax = c;
addl OFFSET2(%rip), %eax ; eax += b;
movq OFFSET3(%rip), %rcx ; rcx = &a;
movl %eax, (%rcx) ; *rcx = eax;
popq %rbp ; // Standard stack frame teardown
retq ; return
Так как x86_64 использует eax
в качестве возвращаемого регистра для 32-битных значений, результат добавления находится в «правильном» place ", чтобы вернуть его уже - дополнительный код не требуется.
В более сложных функциях могут быть некоторые незначительные накладные расходы, необходимые для обеспечения возврата возвращаемого значения в правый регистр. Вообще говоря, эти накладные расходы должны быть минимальными.
Тот же принцип применяется к большинству других архитектур - это не относится к x86_64; Я просто использую его, потому что это первый компилятор, который пришел в руки.