【问题标题】:Is it possible to remove the indirection from a class?是否可以从类中删除间接性?
【发布时间】:2016-04-15 10:44:07
【问题描述】:

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

例如Fiber

我想写

Array!Fiber fibers;

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

我查看了scoped,但它随后禁用了复制构造函数,并且不允许我移动类型,这对我来说毫无用处。

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

编辑:

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

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

【问题讨论】:

    标签: d


    【解决方案1】:

    简答:https://dlang.org/library/std/conv/emplace.html(将其设为 void 块数组并放入数组元素中)。

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

    这意味着您不会从在连续内存块中拥有Fiber 实例中受益,因为碎片仍然存在。同时,绕过类固有的多态语义会冒很大的风险,并在代码中增加一个风险点,需要一直格外小心/注意。

    【讨论】:

    • 这不应该只针对Fibers,它更像是一个笼统的问题。我根据您的回答更新了我的问题。
    • 是的,没错。它仍然非常脆弱 @system 级别的代码,但您需要非常小心地维护。
    猜你喜欢
    • 1970-01-01
    • 2010-10-10
    • 1970-01-01
    • 1970-01-01
    • 2017-08-19
    • 1970-01-01
    • 2023-03-22
    • 1970-01-01
    • 2021-09-25
    相关资源
    最近更新 更多