1

我有以下 zig 代码(简化):

const allocator = ...;

const Entry = struct {
    name: []u8,
};

fn list() ![]u8 {
    var entries = try std.json.parse([]Entry, ...);
    defer std.json.parseFree([]Entry, entries, ...);
    return entries[0];
}

fn main() !void {
    const e = try list();
    ...
}

一切都(取消)分配allocator

我想退回entries[0]并回收其他所有东西。问题是parseFree这里回收了所有东西,包括entries[0]所以我似乎无法使用这个功能。

那么在不复制的情况下,最有效的方法是什么?如果Entry是一个大结构并且我只想返回一个它的字段,比如说Entry.name(并且再次回收其他所有内容)怎么办?

4

1 回答 1

0

实现您想要的最快的方法是不使用 parseFree 而是:

const first = entries[0].name;
for (entries[1..entries.len]) |e| alloc.free(e.name); // frees individual strings
alloc.free(entries); // frees the array of structs

return Entry { .name = first };

这相当简单,但依赖于理解 std.json 是如何分配内存的,并且实现可能有一天想要以不同的方式分配东西,导致上面的代码中断。

因此,我的建议是仅复制字符串,并且只有在您证明避免该复制会带来明显的好处时才诉诸这种额外的复杂性。

于 2021-07-17T22:28:20.323 回答