首页 > 解决方案 > 在不实际将地址传递给函数的情况下如何实现“按引用传递”?

问题描述

我很清楚在 C 和 C++ 中,所有内容都是按值传递的(即使该值是引用类型)。我认为(但我不是那里的专家)Java 也是如此。

所以,这就是为什么我将与语言无关的标签包含在内的原因,在什么语言中我可以将任何东西传递给函数而不传递一些值?

如果存在,该机制是什么样的?我仔细考虑过,我没有想出任何不涉及传递值的机制。

即使编译器以一种我没有指针/引用作为内存中真正变量的方式进行优化,它仍然必须计算地址作为与堆栈(帧)指针的偏移量 - 并传递它。

有谁能给我解惑?

标签: language-agnosticpass-by-referencepass-by-value

解决方案


从 C 的角度来看:

没有参考作为语言级别的概念。通过用指针指向对象来引用对象。

指针的值是指向对象的地址。指针是按值传递的,就像任何其他参数一样。指向对象在概念上是通过引用传递的。


至少从 C++ 的角度来看:

“通过引用”是如何实现的 [...] ?

通常,通过复制对象的地址。

...没有实际将地址传递给函数?

如果函数调用是内联扩展的,则无需在任何地方复制地址。这同样适用于指针,因为由于 as-if 规则,副本可能会被省略。


我可以用什么语言将任何东西传递给函数而不传递一些值?

这种语言必须具有与 C 显着不同的函数概念。必须没有堆栈帧推送。

类函数 C 预处理器宏,顾名思义,类似于函数,但它们的参数不会在运行时传递,因为预处理发生在编译之前。

另一方面,您可以拥有全局变量。如果您更改程序的全局状态,并调用不带参数的函数,则从概念上讲,您已经“将新的全局状态传递给函数”而没有传递任何值。


推荐阅读