是否可以从类中删除间接?

时间:2016-04-15 10:44:08

标签: d

我经常遇到某些类的phobos,但通常我不需要多态。

例如Fiber

我想写

Array!Fiber fibers;

但是光纤应该直接分配在数组中。

我查看了scoped,但它禁用了复制构造函数,我不允许移动类型,这对我来说没什么用。

  即使您确定没有指向它的指针,移动类引用也是非法的。因此,移动范围对象是违法的。

编辑:

这是在struct中分配类的正确方法吗?

struct Struct(T)
if(is(T == class)){
    static immutable size = __traits( classInstanceSize, T);
    void[size] buffer;
    T t;
    alias t this;
    this(Args...)(auto ref Args args){
        import std.conv: emplace;
        t = emplace!T(buffer, args);
    }
}

1 个答案:

答案 0 :(得分:1)

简短回答:https://dlang.org/library/std/conv/emplace.html(使其成为无效块的数组并放入数组元素中)。

正确答案:你真的不想在这种情况下这样做而且没有多大意义:)大部分光纤内存来自堆栈分配,而不是Fiber对象的一部分但是单独分配:https://github.com/D-Programming-Language/druntime/blob/master/src/core/thread.d#L4320

这意味着,由于碎片仍然存在,因此在连续内存块中拥有Fiber个实例并不会带来太多好处。与此同时,通过黑客攻击类固有的多态语义并在代码中添加一个需要额外关注/关注的风险点,你会冒很大的风险。