当使用按值调用时,实际参数值将被推入堆栈。请参考电话怎么样?

时间:2010-11-18 15:55:55

标签: c++

当使用按值调用时,实际参数值将被推入堆栈。请参考电话怎么样?什么被推入调用堆栈?

编辑:

很高兴知道java不会使用引用调用。在C ++中怎么样?我将标签从java改为c ++。对不起,感到困惑。

6 个答案:

答案 0 :(得分:2)

Java中没有引用的调用。一切都是按价值呼唤。

来自Is Java "pass-by-reference" or "pass-by-value"?

  

Java始终是按值传递的。困难的是可以理解Java将对象作为通过值传递的引用传递。

来自http://www.javaworld.com/javaworld/javaqa/2000-05/03-qa-0526-pass.html

  

Java通过引用操作对象,所有对象变量都是引用。但是,Java不通过引用传递方法参数;它按值传递它们。

有关详细说明,请参阅this answer

  

参考电话怎么样?什么被推入调用堆栈?

然后将引用推送到操作数堆栈。

答案 1 :(得分:0)

“按值使用呼叫”是什么意思?除了大多数值是对象引用之外,Java 始终按值调用。但是没有“if”或“when”,它总是有效。

所以是的,在字节码级别,引用本身被压入堆栈。这些内容取决于JVM实现(我),但几乎可以肯定它们是内存地址。

答案 2 :(得分:0)

在C ++中,当使用call is reference时,变量的地址被压入堆栈。由于这个原因,新的对象创建将被消除,并且您在被调用者函数中所做的任何更改都将在调用者中可用。

答案 3 :(得分:0)

这取决于C ++实现。也许引用只是作为指针传递。也许他们被放在寄存器而不是堆栈中。也许堆栈甚至不存在。 C ++语言不强制要求任何这些东西。

此外,如何传递内容(例如“调用约定”)在同一实现中可以是不同的。例如,如果函数是内联的,则可以直接使用所指对象而不是通过上述可能性。许多实现提供了扩展,允许您指定调用约定(例如Windows上的__fastcall)。

答案 4 :(得分:0)

引用是“特殊指针”。它是一个物理对象的地址。引用和指针之间的重要区别是两个:

1)引用不能为null,必须始终指向现有对象。

2)您无法将引用重新分配给另一个对象。

此外,引用和对象使用相同的语法“。”而不是“ - >”。

引用非常好,因为您可以避免创建临时对象(例如在函数调用中)。

回到你的问题:什么被推入调用堆栈?

引用所指向的对象的地址。

答案 5 :(得分:0)

它可能与编译器有关,但是g ++将变量的地址放在堆栈上。这通过反汇编代码来显示:

void func_by_ref(int& i) {
    i = 2;
}

(gdb) disas func_by_ref
Dump of assembler code for function _Z11func_by_refRi:
   0x080486b0 <+0>:     push   %ebp
   0x080486b1 <+1>:     mov    %esp,%ebp
   0x080486b3 <+3>:     mov    0x8(%ebp),%eax
   0x080486b6 <+6>:     movl   $0x2,(%eax)
   0x080486bc <+12>:    pop    %ebp
   0x080486bd <+13>:    ret
End of assembler dump.

这与使用指针参数时生成的代码相同,如

void func_by_pointer(int* i) {
    *i = 2;
}