Java 通过值与通过引用(两者之间内存空间分配的差异) 在C++中,我们使用传递引用,我们引用从参数传递到函数的参数的地址,它本质上是指针右边的函数。因此,虽然它们本质上是相同的东西,别名和所有,指针不也需要内存空间吗?因此,我们不应该调用参数函数中的任何东西,让我们调用B指向传递的参数的内存位置,让我们调用a,它反过来是我们值的内存位置(因为a传递了我们值的内存位置作为参数)

Java 通过值与通过引用(两者之间内存空间分配的差异) 在C++中,我们使用传递引用,我们引用从参数传递到函数的参数的地址,它本质上是指针右边的函数。因此,虽然它们本质上是相同的东西,别名和所有,指针不也需要内存空间吗?因此,我们不应该调用参数函数中的任何东西,让我们调用B指向传递的参数的内存位置,让我们调用a,它反过来是我们值的内存位置(因为a传递了我们值的内存位置作为参数),java,c++,memory,pass-by-reference,pass-by-value,Java,C++,Memory,Pass By Reference,Pass By Value,在java中,我们使用pass-by-value来复制传递的地址(例如对对象的引用) 所以最后我并没有真正看到传递值和传递引用之间的区别。Pass by value为原始传递的参数分配内存空间,同时指向该值和Pass by引用的副本将值的内存位置作为参数传递,函数中的参数(分配内存空间的指针)使用该参数指向该值 诚实的传递值复制变量的值并将其传递给函数。这通常是通过将值直接推送到堆栈上来实现的。被调用函数无法修改原始值 例如: a = 5 double(a); <-- but this i

在java中,我们使用pass-by-value来复制传递的地址(例如对对象的引用)


所以最后我并没有真正看到传递值和传递引用之间的区别。Pass by value为原始传递的参数分配内存空间,同时指向该值和Pass by引用的副本将值的内存位置作为参数传递,函数中的参数(分配内存空间的指针)使用该参数指向该值

诚实的传递值复制变量的值并将其传递给函数。这通常是通过将值直接推送到堆栈上来实现的。被调用函数无法修改原始值

例如:

a = 5
double(a); <-- but this is pass-by-value
print a
end

function double(x) <-- x is a variable with a value of 5
    x = 2*x;
    print x;
    return x;
a=5

双(a) 在pass by value中,在运行时计算并传递地址中的值。但在传递引用中,不确定任何值,只将一个地址传递给您自己读取值并直接在内存位置进行更改的函数,而不是传递给您作为传递值的值。这是非常低的级别,可能会导致问题,因为如果一个或多个程序正在同时,内存位置可能是不明确的,这就是java不支持指针的原因之一

在传递值中,当函数执行操作时,内存位置中的数据不会更改。因为它正在对其副本执行操作。比如java中的多线程

在C++中,我们使用传递引用,引用我们所通过的内容的地址。 从参数到函数的参数,函数本质上是指针,对吗

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

但为了简化,您可以将其视为自动取消引用的指针(这是我第一次启动时所做的)。但是当你进入语言时,引用实际上与指针有着根本的不同

因此,虽然它们本质上是相同的东西,别名和所有,指针不也需要内存空间吗

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

所以我们不应该在一个参数函数中调用B点,指向传递的参数的内存位置,让我们调用a

如果您已经用一个代码示例解释了以上内容,那就太好了。但我想我明白了。假设函数不是内联的,那么作为引用传递的任何参数都需要某种形式的链接回到原始对象(因为引用基本上总是引用活动对象)。那么它是如何做到的呢。编译器实现细节(因此您不必在意)。但可能是堆栈上的指针,也可能只是地址寄存器中的地址

哪个又是我们的值的内存位置(因为A将我们的值的内存位置作为参数传递)

也许是,也许不是。引用在语言级别没有物理位置。因此,编译器可以用它玩很多漂亮的小把戏

在java中,我们使用pass-by-value来复制传递的地址(例如对对象的引用)

在Java中,通过值传递引用。但是Java引用基本上只是内存位置的指针。因此,您正在按值传递指针。这是一种可以使用的技术。幸运的是,C++并没有限制你使用单一的技术。 可以通过值或引用传递参数。您甚至可以通过值或引用传递指向对象的指针。因此,根据具体情况,可以使用一些有趣的技术


所以最后我并没有真正看到传递值和传递引用之间的区别

这可能是因为您考虑的是java引用(通过值传递)

C++中的P>如果按值传递,则创建一个作为参数传递的新对象(这意味着您要复制原始对象,这可能会产生成本)。如果按引用传递,则将别名传递给对象。因此,当您与对象交互时,您正在修改原始对象

 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为原始传递的参数分配内存空间,同时指向该值和Pass by引用的副本将值的内存位置作为参数传递,函数中的参数(分配内存空间的指针)使用该参数指向该值


很抱歉,我把它弄丢了。

您有什么问题?对于传递引用,函数中的参数是否需要内存分配。是指针,对吗?那么,这与传递值有何不同呢?传递值也需要从服务器的内存地址副本中分配内存