parameter-passing - vala 是 "pass by reference"还是 "pass by value"?

标签 parameter-passing vala

或者存在像 这样的指针和引用C ?

我正在尝试开始使用 vala,但很高兴知道 vala 是“按引用传递”还是“按值传递”

最佳答案

首先你应该明白默认的vala编译器valac编译为 C(作为一种中间语言)。然后使用 C 编译器(通常是 gcc)编译代码。
valac -C example.vala将编译为 example.c
因此,您可以自己检查生成的 C 代码。

现在回到真正的问题:

Vala 支持两者 call-by-valuecall-by-reference .它甚至比这更细粒度。

让我们举一个使用普通 C 数据类型 (int) 的示例。

按值调用:

public void my_func (int value) {
    // ...
}

无论您如何处理 value,该值都会被复制到函数中。内my_func它不会影响调用者。

使用 ref 进行引用调用:
public void my_func (ref int value) {
    // ...
}

地址将被复制到函数中。您所做的一切 valuemy_func也将反射(reflect)在调用方。

使用 out 进行引用调用:
public void my_func (out int value) {
    // ...
}

ref基本相同,但在调用 my_func 之前不必初始化该值.

对于 GObject基于数据类型(非静态类)它变得更加复杂,因为您必须考虑内存管理。

由于这些总是使用指针(隐式)管理,ref和 `out' 修饰符现在反射(reflect)了(隐式)指针是如何传递的。

可以这么说,它增加了一层间接。
string和数组数据类型也在内部使用指针和自动引用计数 (ARC) 进行管理。

虽然 气馁 , Vala 也支持指针,所以你可以有一个 int *MyClass *就像在 C 中一样。

关于parameter-passing - vala 是 "pass by reference"还是 "pass by value"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31163807/

相关文章:

c - Vala vapi 文件文档

fortran - 在类型绑定(bind)的基本过程中将对象作为 Intent(inout) 传递

javascript - jquery 从 javascript 文件获取 GET 变量

PHP:通过引用的可变长度参数列表?

dictionary - 将函数应用于 vala 数组的每个元素

linux - 为 Linux 创建调整

linux - 尝试在 Ubuntu 中安装 Gtkaml(和 libval​​a-0.16)时出现奇怪的错误

gtk - 瓦拉 Gtk 模板 : UI Resource not found

arrays - 从其他数组继承大小的简洁表示法?

c - 动态内存访问仅在函数内部有效