2

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

伪代码:

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

A类型对象的内存布局:

4 bytes | int c

(4/8) bytes | address of b

有没有办法创建一个将 b 直接嵌入 A 而不是引用的类?还是我忽略了什么?

4

3 回答 3

2

有一些选项:

首先,您可以创建B一个结构类型,如果您不需要 ref 语义,那么首先不要将其设为类。

否则你可以使用就地scoped!B分配。b

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

在这两种情况下,当包含它的 A 被销毁时,都会调用 B 的析构函数。

于 2016-03-10T13:36:19.823 回答
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);
    }
}
于 2016-03-10T14:38:59.587 回答
0

scoped!T在上面的答案中是一个函数,而不是一个类型;因此,给定的示例将不起作用。原因是必须使用构造函数调用来初始化类。

作为一种解决方法,typeof()在类的构造函数中使用并初始化该成员:

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

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

于 2016-03-11T14:08:23.203 回答