函数参数:"ref"关键字或D中的指针?
Function parameters: "ref" keyword or pointers in D?
我目前正在学习 D,发现它允许以与 C++ 中大致相同的方式定义指针,但是,它还允许通过 ref 关键字按引用传递。关于函数参数,我有以下问题:
是否可以在D中完全不使用指针来定义函数参数?如果是这样,通常这样做的最佳做法是什么?我的理解是 ref 关键字的目的是避免必须将函数输入参数定义为指针。
即使问题 1 的答案是 "yes",是否存在在函数中使用指针而不是 "ref" 关键字更有利的情况?
例如,以下两个代码产生相同的结果。除了使用 "ref" 关键字更方便之外,一个比另一个更好吗?
代码 1(使用指针):
import std.stdio;
struct X {
int s;
int y;
}
pure void my_func(X *x) {
x.s = 10;
x.y = 90;
}
void main() {
X cat = X(1,2);
X *cat_ptr = &cat;
writeln(cat.y);
my_func(cat_ptr);
writeln(cat.y);
}
代码 2(使用 "ref" 关键字):
import std.stdio;
struct X {
int s;
int y;
}
pure void my_func(ref X x) {
x.s = 10;
x.y = 90;
}
void main() {
X cat = X(1,2);
writeln(cat.y);
my_func(cat);
writeln(cat.y);
}
我大多来自 Java 背景,所以我对这些概念的理解不是很好。
我发现在 D 中很少看到原始指针。对于数组,您使用切片(如 int[]
)。要通过引用传递某些内容,您可以将其声明为 ref
参数。你在合适的地方使用 类,还有 RefCounted
,它本质上是一个智能指针。
D 中最常见的指针替换可能是切片(指针在很多方面都可以被视为包含零个或一个元素的切片)。也就是说,如果不考虑 this
,它本质上也是一个指针。
D 的切片只是指针的薄包装,因此您基本上可以用它们做完全相同的事情,但常用操作使用切片更安全。权衡是它稍微慢一点,因为元素访问是范围检查的。
既然你说你来自 Java 背景,我会补充说你通常可以用 D 编写几乎完全相同的代码,它会编译和 运行,并执行完全相同的操作它在 Java 中做了同样的事情。它不会是惯用的 D,但它会起作用。
更新,因为问题已更改:
在示例代码中,没有理由在 ref 参数上使用指针 - 它应该编译为完全相同的机器代码。通常,只有在进行指针运算时才应该使用指针。如果你不确定你要去,就假设你不会。
我目前正在学习 D,发现它允许以与 C++ 中大致相同的方式定义指针,但是,它还允许通过 ref 关键字按引用传递。关于函数参数,我有以下问题:
是否可以在D中完全不使用指针来定义函数参数?如果是这样,通常这样做的最佳做法是什么?我的理解是 ref 关键字的目的是避免必须将函数输入参数定义为指针。
即使问题 1 的答案是 "yes",是否存在在函数中使用指针而不是 "ref" 关键字更有利的情况?
例如,以下两个代码产生相同的结果。除了使用 "ref" 关键字更方便之外,一个比另一个更好吗?
代码 1(使用指针):
import std.stdio;
struct X {
int s;
int y;
}
pure void my_func(X *x) {
x.s = 10;
x.y = 90;
}
void main() {
X cat = X(1,2);
X *cat_ptr = &cat;
writeln(cat.y);
my_func(cat_ptr);
writeln(cat.y);
}
代码 2(使用 "ref" 关键字):
import std.stdio;
struct X {
int s;
int y;
}
pure void my_func(ref X x) {
x.s = 10;
x.y = 90;
}
void main() {
X cat = X(1,2);
writeln(cat.y);
my_func(cat);
writeln(cat.y);
}
我大多来自 Java 背景,所以我对这些概念的理解不是很好。
我发现在 D 中很少看到原始指针。对于数组,您使用切片(如 int[]
)。要通过引用传递某些内容,您可以将其声明为 ref
参数。你在合适的地方使用 类,还有 RefCounted
,它本质上是一个智能指针。
D 中最常见的指针替换可能是切片(指针在很多方面都可以被视为包含零个或一个元素的切片)。也就是说,如果不考虑 this
,它本质上也是一个指针。
D 的切片只是指针的薄包装,因此您基本上可以用它们做完全相同的事情,但常用操作使用切片更安全。权衡是它稍微慢一点,因为元素访问是范围检查的。
既然你说你来自 Java 背景,我会补充说你通常可以用 D 编写几乎完全相同的代码,它会编译和 运行,并执行完全相同的操作它在 Java 中做了同样的事情。它不会是惯用的 D,但它会起作用。
更新,因为问题已更改:
在示例代码中,没有理由在 ref 参数上使用指针 - 它应该编译为完全相同的机器代码。通常,只有在进行指针运算时才应该使用指针。如果你不确定你要去,就假设你不会。