garbage-collection - 在 D 中制作结构的堆副本

标签 garbage-collection stack immutability d

如何创建堆栈上结构的垃圾收集副本?

来自 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);
}

最佳答案

您的示例过于复杂,甚至无法编译,但本质上,听起来您想要做的事情就像

struct Foo
{
    int i;
}

void main()
{
    auto f = Foo(5);
    auto g = new Foo(f);
}

没有任何特殊的构造函数你可以做的是
void main()
{
    auto f = Foo(5);
    auto g = new Foo;
    *g = f;
}

但显然这比您可能想要的步骤多。 D 的正常“复制构造函数”是 postblit 构造函数,它被声明为 this(this) {...} ,但 Foo 不需要,因为它在这里声明(因为它的所有成员都是值类型),并且它对分配结构没有帮助无论如何都在堆上 - 只需复制一个结构。可以说
auto f = Foo(5);
auto g = new Foo(f);

应该可以正常工作,但目前还不行,而且不幸的是,语言中不支持为您定义它。所以,不幸的是,我认为你目前被迫做一些类似于你试图避免的事情。例如
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);
}

但是,我刚刚打开了 an enhancement request 以便 new Foo(foo) 可以正常工作,并且在 dmd (2.066) 的下一个版本中,我们将获得原始类型的通用构造(例如 new int(5) 现在可以工作),所以我认为有这也是一个很好的论据。

不过现在,您将不得不提供一个额外的构造函数来使其工作。

关于garbage-collection - 在 D 中制作结构的堆副本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24216231/

相关文章:

java - 垃圾收集过程中什么是引用处理

c - 后缀符号 - 堆栈弹出和推送帮助,内存地址打印而不是实际数字

java - 从堆栈打印时如何跳过空格

java - 仅使用不可变数据类型会使 Java 程序线程安全吗?

java - 为什么垃圾收集器没有比个位数的堆空闲百分比更快地进行更积极的垃圾收集?

java - 使用不同用户执行jstack导致Full GC

java - java.util.Stack.clear() 的性能

rust - 正确拆分时,Rust不允许可变借用

c#-4.0 - 为什么当引用更改时,可变 StringBuilder 的行为类似于不可变字符串?

java.lang.OutOfMemoryError : GC overhead limit exceeded on WSO2 MB 错误