Mat*_*ine 4 stack garbage-collection d immutability
如何创建堆栈中的结构的垃圾收集副本?
来自C++背景,我的第一个猜测将是一个像下面那样的复制构造函数,但对于D来说它似乎不是很惯用,而且我没有在任何D项目中看到过我看过的.
struct Foo {
immutable int bar;
this(int b) { bar = b; }
// A C++-style copy constructor works but doesn't seem idiomatic.
this(ref const Foo f) { bar = f.bar; }
}
void main()
{
// We initialize a Foo on the stack
auto f = Foo(42);
// Now I want to get a heap copy of its member. How?
// A C++-style copy constructor works but doesn't seem idiomatic.
Foo* f1 = new Foo(f);
}
Run Code Online (Sandbox Code Playgroud)
你的例子过于复杂,甚至没有编译,但实质上,它听起来像你想要做的就像是
struct Foo
{
int i;
}
void main()
{
auto f = Foo(5);
auto g = new Foo(f);
}
Run Code Online (Sandbox Code Playgroud)
没有任何特殊构造函数你可以做什么
void main()
{
auto f = Foo(5);
auto g = new Foo;
*g = f;
}
Run Code Online (Sandbox Code Playgroud)
但显然这比你想要的步骤更多.D的正常"复制构造函数"是一个postblit构造函数,它被声明为this(this) {...}
,但这不是必需的,Foo
因为它在这里声明(因为它的所有成员都是值类型),并且它没有帮助分配一个结构无论如何堆 - 只需复制一个结构.按理说
auto f = Foo(5);
auto g = new Foo(f);
Run Code Online (Sandbox Code Playgroud)
应该只是工作,但目前,它没有,并且不幸的是,没有语言支持为您定义它.所以,不幸的是,我认为你目前被迫做一些类似于你想要避免的事情.例如
struct Foo
{
int i;
this(int j)
{
i = j;
}
this(Foo rhs)
{
this = rhs;
}
}
void main()
{
auto f = Foo(5);
auto g = new Foo(f);
}
Run Code Online (Sandbox Code Playgroud)
但是,我刚刚打开了一个增强请求,使它能够new Foo(foo)
正常工作,并且随着dmd(2.066)的下一个版本,我们将获得原始类型的通用构造(例如new int(5)
现在可以工作),所以我认为有这也是一个非常好的论据.
但是现在,你将不得不提供额外的构造函数来实现它.
归档时间: |
|
查看次数: |
419 次 |
最近记录: |