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()
是文件系统树结构的一个成员函数,其中每个节点都包含对classDir
实例的引用,听起来像是您想要使用的
const(Dir)[] parents;
如果Dir是一个类,它将不允许您执行可以重新分配的const引用(我认为这是为了在某个时候进行更改,有一段时间有一个pull请求,不确定当前状态是什么),但是您可以通过制作一个小数组来绕过它:
const(Dir)[1] pathSlow;
然后将其称为
pathSlow[0]
Ok。我就是这么想的。