use*_*819 3 c++ java memory pass-by-reference pass-by-value
在 C++ 中,我们使用引用传递,我们引用从参数传递到函数参数的任何地址,这本质上是一个指针,对吗?因此,虽然它们本质上是相同的东西,别名等等,但指针不是也需要内存空间吗?因此,无论我们在参数函数中拥有什么,都不应该让我们调用 B 指向所传递的参数的内存位置,让我们调用 A,而 A 又是我们值的内存位置(因为 A 传递了我们值的内存位置)作为论点)?
在java中,我们使用按值传递,我们会复制我们传递的任何内容的地址(例如对对象的引用)。
所以最后我并没有真正看到按值传递和按引用传递之间的区别。按值传递为原始传递的参数在内存中分配空间,并且指向该值和按引用传递的副本将值的内存位置作为参数(在内存中分配空间的指针)传递给我们的参数(在内存中分配空间的指针)函数用来指向值。
在 C++ 中,我们使用引用传递,我们引用从参数传递到函数参数的任何地址,这本质上是一个指针,对吗?
不。引用是现有变量的别名(即替代名称)。
但在汇编级别,您的实现可能会将引用变量的地址放入地址寄存器(或类似的东西)中,以供被调用函数使用(如果这就是您的意思)。
但为了简单起见,您可以将其视为自动取消引用的指针(这就是我刚开始时所做的)。但是当你进入语言时,引用实际上与指针有根本的不同。
因此,虽然它们本质上是相同的东西,别名等等,但指针不是也需要内存空间吗?
C++ 级别的指针需要空间(因为它是可寻址的)。您可以获取指针的地址。基本上,引用不需要空间(因为您无法获取其地址)。在实现级别,它可能有也可能没有物理内存位置,具体取决于编译器如何实现它。
因此,我们在参数函数中拥有的任何内容都不应该让我们调用 B 指向所传递的参数的内存位置,让我们调用 A
如果您能用代码示例来解释上述内容,那就太好了。但我想我明白了。假设该函数不是内联的,那么作为引用传递的任何参数都需要某种形式的链接回原始对象(因为引用总是从根本上引用活动对象)。那么它是如何做到的呢。编译器实现细节(所以你不应该关心)。但可能是堆栈上的指针,或者可能只是地址寄存器中的地址。
这又是我们值的内存位置(因为 A 将我们值的内存位置作为参数传递)?
也许或不。参考文献在语言级别没有物理位置。所以编译器可以用它玩很多漂亮的小技巧。
在java中,我们使用按值传递,我们会复制我们传递的任何内容的地址(例如对对象的引用)。
在 Java 中,您按值传递引用。但 Java 引用本质上只是内存位置的指针。所以你正在按值传递指针。这是一种可以使用的技术。幸运的是,C++ 并不将您限制于单一技术。
您可以按值或引用传递参数。您甚至可以通过值或引用传递指向对象的指针。因此,根据具体情况可以使用一些有趣的技术。
所以最后我并没有真正看到按值传递和按引用传递之间的区别。
也许这是因为您正在考虑 java 引用(按值传递)。
在C++中。如果按值传递,则将创建一个作为参数传递的新对象(这意味着您将复制原始对象,这可能会产生成本)。如果通过引用传递,则将别名传递给对象。因此,当您与对象交互时,您正在修改原始对象。
int inc(int val) // pass by value
{
return ++val; // increment the passed value and return as a result.
}
int incref(int& val) // pass by reference
{
return ++val; // increment the reference.
// Since the reference is an alias this increment affects the
// original object. The result is returned.
}
void code()
{
int x = 5;
int y = inc(x); // x =5 and y = 6
int a = 8;
int b = incref(a); // a = 9 and b = 9
}
Run Code Online (Sandbox Code Playgroud)
按值传递为原始传递的参数在内存中分配空间,并且指向该值和按引用传递的副本将值的内存位置作为参数(在内存中分配空间的指针)传递给我们的参数(在内存中分配空间的指针)函数用来指向值。
抱歉我把它弄丢了。
| 归档时间: |
|
| 查看次数: |
2431 次 |
| 最近记录: |