高效安全纯净的路径构建

时间:2013-12-08 19:48:18

标签: memory-management d heap-memory

我正在尝试实现一个高性能buildPath的变体(最小堆活动)和@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;
}

但由于parentscurrParent上的常量问题,它无法编译。

/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和非const而不是@safe constparents非const,代码编译可能是可接受的但绝对不是很漂亮。

是否可以声明const class Dir的可变数组 - 引用(parents)和 对const对象(pathSlow)的可变引用?如果是这样,那将以优雅的方式解决这个问题。

请注意,path()是文件系统树结构的成员函数,其中每个节点都包含对类Dir的实例的引用。

1 个答案:

答案 0 :(得分:1)

听起来像是要使用

const(Dir)[] parents;

如果Dir是一个类,它不会让你做一个可以重新分配的const引用(我想这是打算在某个时候改变,有一段时间的拉请求,不知道当前是什么状态是),但你可以通过制作一个小数组来解决它:

const(Dir)[1] pathSlow;

然后将其称为pathSlow[0]