Ger*_*erd 3 language-agnostic pass-by-reference pass-by-value
我很清楚,在 C 和 C++ 中,所有内容都是按值传递的(即使该值是引用类型)。我认为(但我不是这方面的专家)Java 也是如此。
因此,这就是为什么我将与语言无关的标签包含在内,在什么语言中我可以将任何内容传递给函数而不传递某些值?
如果存在的话,其机制是什么样的?我认真思考了这一点,但我没有想出任何不涉及值传递的机制。
即使编译器以某种方式优化,我在内存中没有指针/引用作为真正的变量,它仍然必须计算一个地址作为堆栈(帧)指针的偏移量 - 并传递它。
有谁可以启发我吗?
从C的角度来看:
没有作为语言级别概念的参考。通过用指针指向对象来引用它们。
指针的值是所指向对象的地址。指针像任何其他参数一样按值传递。指向的对象在概念上是通过引用传递的。
至少从C++的角度来看:
“通过引用传递”是如何实现的[...]?
通常,通过复制对象的地址。
...没有实际将地址传递给函数?
如果函数调用是内联扩展的,则无需将地址复制到任何地方。这同样适用于指针,因为由于 as-if 规则,副本可能会被省略。
在什么语言中我可以将任何东西传递给函数而不传递一些值?
这种语言必须具有与 C 语言显着不同的函数概念。必须没有堆栈帧推送。
类函数 C 预处理器宏,顾名思义,与函数类似,但它们的参数不会在运行时传递,因为预处理发生在编译之前。
另一方面,您可以拥有全局变量。如果更改程序的全局状态,并调用不带参数的函数,则从概念上讲,您已经“将新的全局状态传递给函数”,而没有传递任何值。