Теоретически в C ++ упомянутые ссылки реализованы как обычные указатели. Затем компилятор изменяет код для функции тона, как ссылка, но загружает адрес и затем косвенно перемещает адрес.
Вот небольшое приложение:
void foo( int & value )
{
value = 3;
}
void bar( int *value )
{
*value = 3;
}
void do_test()
{
int i;
foo(i);
bar(&i);
}
Давайте соберем его и посмотрим на сгенерированный сборкой gcc (gcc -s):
.file "test-params.cpp"
.text
.globl _Z3fooRi
.type _Z3fooRi, @function
_Z3fooRi:
.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
movl 8(%ebp), %eax
movl $3, (%eax)
popl %ebp
ret
.cfi_endproc
.LFE0:
.size _Z3fooRi, .-_Z3fooRi
.globl _Z3barPi
.type _Z3barPi, @function
_Z3barPi:
.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
movl 8(%ebp), %eax
movl $3, (%eax)
popl %ebp
ret
.cfi_endproc
.LFE1:
.size _Z3barPi, .-_Z3barPi
.globl _Z7do_testv
.type _Z7do_testv, @function
_Z7do_testv:
.LFB2:
.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 $20, %esp
leal -4(%ebp), %eax
movl %eax, (%esp)
call _Z3fooRi
leal -4(%ebp), %eax
movl %eax, (%esp)
call _Z3barPi
leave
ret
.cfi_endproc
.LFE2:
.size _Z7do_testv, .-_Z7do_testv
.ident "GCC: (Ubuntu 4.4.3-4ubuntu5) 4.4.3"
.section .note.GNU-stack,"",@progbits
Как видите, в обеих функциях компилятор читает (stack movl 8(%ebp), %eax
), а при обоих вызовах компилятор сохраняет адрес в стеке (leal -4(%ebp), %eax)
.
Ответ GMan - Возможно, проблема в том, что Save Unico дал декларацию C. Кажется, проблема заключается в совместимости между Си и Фортраном (по крайней мере, теми двумя компиляторами, которые вы используете).