D 中的 RAI for structs,避免昂贵的复制

RAI in D for structs, avoiding expensive copying

我是D编程语言的新手。我打算在 D 中编写一些 C 库的绑定。所以这个问题。

假设我们有一个结构S(不是class!)

假设以下所有操作都是昂贵的操作:

现在我想像这样传递 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());
}