我经常遇到某些类的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);
}
}
答案 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
个实例并不会带来太多好处。与此同时,通过黑客攻击类固有的多态语义并在代码中添加一个需要额外关注/关注的风险点,你会冒很大的风险。