gpt4 book ai didi

java - Pass by value vs Pass by reference(两者在内存空间分配上的区别)

转载 作者:太空狗 更新时间:2023-10-29 20:42:35 24 4
gpt4 key购买 nike

在我们使用引用传递的 C++ 中,我们引用了我们从参数传递给函数参数的地址,它本质上是一个指针,对吗?因此,虽然它们本质上是相同的东西,别名和所有,但指针不也需要内存空间吗?因此,无论我们在参数函数中拥有什么,都不应该让我们调用 B 指向传递的参数的内存位置让我们调用 A,这反过来又是我们值的内存位置(因为 A 传递了我们值的内存位置作为参数)?

在我们使用按值传递的 java 中,我们复制了我们传递的任何地址(例如对对象的引用)。

所以最后我并没有真正看到按值传递和按引用传递之间的区别。按值传递在内存中为原始传递的参数分配空间,同时指向值和按引用传递的拷贝将我们值的内存位置作为参数传递,我们的参数(在内存中分配空间的指针)函数用于指向值。

最佳答案

In C++ where we use pass by reference we reference the address of whatever it is that we passed from the argument to the parameter of the function which is essentially a pointer right?

没有。引用是现有变量的别名(即替代名称)。
但是在汇编级别,您的实现可能会将引用变量的地址放在地址寄存器(或类似的东西)中以供被调用函数使用(如果这是您的意思)。

但是为了简单起见,您可以将其视为一个自动取消引用的指针(这是我刚开始时所做的)。但是当你进入语言时,引用实际上与指针根本不同。

So while they are essentially the same thing, alias and all, doesnt a pointer require memory space as well?

C++ 级别的指针需要空间(因为它是可寻址的)。您可以获取指针的地址。从根本上说,引用不需要空间(因为你不能获取它的地址)。在实现级别,它可能有也可能没有物理内存位置,具体取决于编译器如何实现它。

So shouldnt whatever we have in a parameter function let us call B point to the memory location of whatever the argument was that was passed let us call A

如果您用代码示例解释了上述内容,那就太好了。但我想我明白了。假设函数没有内联,那么作为引用传递的任何参数都需要某种形式的链接回到原始对象(因为引用总是从根本上引用 Activity 对象)。那么它是怎么做到的。编译器实现细节(所以你不应该关心)。但可能是堆栈上的指针,或者可能只是地址寄存器中的地址。

which in turn is the memory location of our value( since A passed the memory location of our value as the argument)?

也许吧,也许吧。引用文献在语言级别没有物理位置。所以编译器可以玩很多不错的小把戏。

In java where we use pass by value we make a copy of the address of whatever it was we passed(the reference to the object for example).

在 Java 中,您按值传递引用。但是 Java 引用基本上只是内存位置的指针。因此,您正在按值传递指针。这是一种使用的技术。幸运的是,C++ 并不限制您使用单一技术。

您可以按值或引用传递参数。您甚至可以按值或引用传递指向对象的指针。因此,根据情况使用一些有趣的技术。

So in the end i'm not truely seeing the difference between pass by value and pass by reference.

也许那是因为您正在考虑 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
}

Pass by value allocates space in memory for the original passed argument and the copy that both point to the value and pass by reference passes the memory location of our value as the argument which the parameter(the pointer which allocates space in the memory ) in our function uses to point to the value.

对不起,我弄丢了。

关于java - Pass by value vs Pass by reference(两者在内存空间分配上的区别),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18050223/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com