D 中的 RAI for structs,避免昂贵的复制
RAI in D for structs, avoiding expensive copying
我是D编程语言的新手。我打算在 D 中编写一些 C 库的绑定。所以这个问题。
假设我们有一个结构S
(不是class!)
假设以下所有操作都是昂贵的操作:
S
初始化(构造函数);
S
终结(析构);
S
postblit.
现在我想像这样传递 S
值:
S func(const ref S x) {
return S(x);
}
问题:是否会过度(至少足以表达我的算法)使用上述昂贵的操作?如果是,如何预防?
请注意,出于实际性能原因,我使用结构而不是 class。
以下程序显示确实发生了过度复制:
$ ./init_test
Initialization
Postblit
Finalization
Finalization
程序文本:
import std.stdio;
struct Expensive {
static create() {
writeln("Initialization");
return Expensive.init;
}
~this() {
writeln("Finalization");
}
this(this) {
writeln("Postblit");
}
}
Expensive func(const Expensive x) { // `ref const` results in compilation error
return x;
}
void main() {
Expensive obj = func(Expensive.create());
}
我是D编程语言的新手。我打算在 D 中编写一些 C 库的绑定。所以这个问题。
假设我们有一个结构S
(不是class!)
假设以下所有操作都是昂贵的操作:
S
初始化(构造函数);S
终结(析构);S
postblit.
现在我想像这样传递 S
值:
S func(const ref S x) {
return S(x);
}
问题:是否会过度(至少足以表达我的算法)使用上述昂贵的操作?如果是,如何预防?
请注意,出于实际性能原因,我使用结构而不是 class。
以下程序显示确实发生了过度复制:
$ ./init_test
Initialization
Postblit
Finalization
Finalization
程序文本:
import std.stdio;
struct Expensive {
static create() {
writeln("Initialization");
return Expensive.init;
}
~this() {
writeln("Finalization");
}
this(this) {
writeln("Postblit");
}
}
Expensive func(const Expensive x) { // `ref const` results in compilation error
return x;
}
void main() {
Expensive obj = func(Expensive.create());
}