Just out of curiosity, I wrote two similar functions (uses 8-byte data types) to check their assembly code.
long long int ret_val() { long long int tmp(1); return tmp; } // ret_val() assembly .globl _Z7ret_valv .type _Z7ret_valv, @function _Z7ret_valv: .LFB0: .cfi_startproc .cfi_personality 0x0,__gxx_personality_v0 pushl %ebp .cfi_def_cfa_offset 8 movl %esp, %ebp .cfi_offset 5, -8 .cfi_def_cfa_register 5 subl $16, %esp movl $1, -8(%ebp) movl $0, -4(%ebp) movl -8(%ebp), %eax movl -4(%ebp), %edx leave ret .cfi_endproc
Surprisingly , the pass-by-value method below required a few more instructions:
void output_val(long long int& value) { long long int tmp(2); value = tmp; } // output_val() assembly .globl _Z10output_valRx .type _Z10output_valRx, @function _Z10output_valRx: .LFB1: .cfi_startproc .cfi_personality 0x0,__gxx_personality_v0 pushl %ebp .cfi_def_cfa_offset 8 movl %esp, %ebp .cfi_offset 5, -8 .cfi_def_cfa_register 5 subl $16, %esp movl $2, -8(%ebp) movl $0, -4(%ebp) movl 8(%ebp), %ecx movl -8(%ebp), %eax movl -4(%ebp), %edx movl %eax, (%ecx) movl %edx, 4(%ecx) leave ret .cfi_endproc
These functions were called in test code as:
long long val = ret_val(); long long val2; output_val(val2);
Compiled by gcc.
source share