Dlang - 有没有办法在对象中嵌入对象?

时间:2016-03-10 13:12:02

标签: memory-management d memory-layout

根据D规范,所有类都通过引用访问,这意味着下面的类将在内存中布局如下。

伪代码:

class A
{
    public int c;
    public B b;
}

A类对象的内存布局:

4 bytes | int c

(4/8) bytes | address of b

有没有办法创建一个可以直接在A中嵌入b而不是引用的类?或者我忽略了什么?

3 个答案:

答案 0 :(得分:2)

有一些选择:

首先你可以使B成为一个结构类型,如果你不需要ref语义,那么就不要让它成为一个类。

否则,您可以使用scoped!B分配b

import std.typecons;
class A
{
    public int c;
    public scoped!B b;
}

在这两种情况下,当包含它的A被破坏时,将调用B的析构函数。

答案 1 :(得分:1)

Scoped比我想象的更好,你也可以使用在这个简单的情况下有点麻烦的emplace,但可能会派上用场:

class A {
    import std.conv;

    public  B b;

    // We can't just use sizeof here because we want the size of the
    // instance, not the reference.
    private void[__traits(classInstanceSize, B)] b_space;

    this() {
        b = emplace!B(b_space);
    }
}

答案 2 :(得分:0)

上面答案中的

scoped!T是一个函数,而不是一个类型;因此,给定的例子将不起作用。原因是必须使用构造函数调用初始化类。

作为解决方法,请使用typeof()并初始化班级中的成员'构造:

import std.typecons;
class B { }
class A {
    public int c;
    public typeof(scoped!B()) b;
    this() {
        this.b = scoped!B();
    }
}

请注意,虽然构造函数中的行看起来像赋值,但它被正确解释为构造。