Memory management 高性能、安全、纯粹的路径构造

Memory management 高性能、安全、纯粹的路径构造,memory-management,d,heap-memory,Memory Management,D,Heap Memory,我试图实现buildPath的一个变体,它是performant(最小堆活动)和@safe和pure 到目前为止,我的努力是成功的 /** Returns: Path to $(D this) File. */ string path() @property @safe const pure { const Dir[] parents; // collect parenting Dirs auto currParent = parent; size_t pathL

我试图实现
buildPath
的一个变体,它是performant(最小堆活动)和
@safe
pure

到目前为止,我的努力是成功的

/** Returns: Path to $(D this) File. */
string path() @property @safe const pure {
    const Dir[] parents;
    // collect parenting Dirs
    auto currParent = parent;
    size_t pathLength = 0; // returned path length
    while (currParent !is null) {
        if (currParent !is parent) {
            pathLength += 1;
        }
        pathLength += currParent.name.length;
        parents ~= currParent;
        currParent = parent.parent;
    }

    // build path
    auto path_ = new char[pathLength];
    size_t i = 0;
    foreach (currParent_; parents) {
        const parentName = currParent_.name;
        if (i != 0) {
            path_[++i] = '/';
        }
        path_[i .. parentName.length] = parentName[];
        i += parentName.length;
    }
    return path;
}
但它无法编译,因为
父项
当前父项
上的常量存在问题

/home/per/Work/justd/fs.d(408): Error: cannot modify const expression parents
/home/per/Work/justd/fs.d(409): Error: cannot modify const expression currParent
如果我使
path()
@trusted
和non-const而不是
@safe-const
父项
为non-const,那么代码的编译可能是可以接受的,但肯定不漂亮

是否可以声明
const class Dir
-引用(
父类
)和 对常量对象(
pathSlow
)的可变引用?如果是这样的话,这将以一种优雅的方式解决这个问题


请注意,
path()
是文件系统树结构的一个成员函数,其中每个节点都包含对class
Dir
实例的引用,听起来像是您想要使用的

const(Dir)[] parents;
如果Dir是一个类,它将不允许您执行可以重新分配的const引用(我认为这是为了在某个时候进行更改,有一段时间有一个pull请求,不确定当前状态是什么),但是您可以通过制作一个小数组来绕过它:

const(Dir)[1] pathSlow;

然后将其称为
pathSlow[0]

Ok。我就是这么想的。